C++ 棧與隊列

1. 棧

棧是隻能從一端訪問的線性羣體,是一種後進先出的數據結構。

棧示意圖:

                                  

棧的基本狀態:

  • 棧空
  • 棧滿
  • 一般狀態

棧空:棧中沒有元素(以數組容納的棧爲例)

                                 

棧滿:棧中元素個數到達上限(以數組容納的棧爲例)

                                  

一般狀態:棧中有元素,但未達到棧滿狀態(以數組容納的棧爲例)

                                  

棧的基本操作:

  • 初始化
  • 入棧
  • 出棧
  • 清空棧
  • 訪問棧頂元素
  • 檢測棧的狀態(滿、空)
/*棧的抽象數據類型*/
template <class T>
class Stack {
public:                 //棧的運算集
    void clear();       //變爲空棧
    bool push(const T item); //item入棧,成功返回真,否則假
    
    bool pop(T& item);      //返回棧頂內容並彈出,成功返回真,否則假
    bool top(T& item);      //返回棧頂但不彈出,成功返回真,否則假
    bool isEmpty();         //若棧已空返回真
    bool isFull();         //若棧已滿返回真
};

2. 隊列

隊列是隻能向一端添加元素,從另外一端刪除元素的線性羣體。這是一種先進先出的結構。

                   

隊列的基本狀態:

  • 隊空
  • 隊滿
  • 一般狀態

隊空:隊列中還沒有元素

                

隊滿:隊列中元素個數達到上限(以數組容納的隊列爲例)

                

循環隊列:在想象中將數組彎曲呈環形,元素出隊時,後繼元素不移動,每當隊尾達到數組最後一個元素時,便在回到數組開頭。

              

隊列的抽象數據模型:

template <class T> class Queue{
public:                //隊列的運算集
    void clear();       //變爲空隊列
    bool enQueue(const T item); //將item插入隊尾,成功則返回真,否則返回假
    bool deQueue(T & item);   //返回隊頭元素並將其從隊列中刪除,成功則返回真
    bool getFront(T & item);  //返回隊頭元素,但不刪除,成功則返回真
    bool isEmpty();           //返回真,若隊列已空
    bool usFull();            //返回真,若隊列已滿
};

順序隊列的類定義:

class arrQueue:public Queue<T>{
private:  
    int mSize;            //存放隊列的數組的大小
    int front;           //表示隊頭所在位置的下標
    int rear;            //表示隊尾所在位置的下標
    T * qu;              //存放類行爲T的隊列元素的數組
public:                 //隊列的運算集
    arrQueue(int size);  //創建隊列的實例
    ~arrQueue();         //消除該實例,並釋放其空間
}

/*順序隊列代碼實現*/
bool enqueue(const Elem & it){
    if (((rear+2) % size)==front) return false;
                             //還剩一個空位,就要報滿
    rear = (rear+1) % size;  //因爲實指,需要先移動到下一個空位
    listArray[rear] = it;
    return true;
}
bool dequeue(Elem & it){
    if (length() ==0)  return false;
                             //隊列爲空
    it = listArray[front];   //先出隊,在移動front下標
    front = (front=1) % size;   //環形增加
    return true;
}
bool frontValue(Elem & it) const {
    if (length() == 0)
        return false;       //隊列爲空
    it = listArray[front];   return true;
}
int length() const {
    return (size+(rear - front + 1)) % size;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章