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;
}