1 定義
棧是限定只能在表尾刪除和插入操作的線性表。
允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom)。棧又稱為后進先出(Last In First Out)的線性表,簡稱LIFO結構。
棧的插入操作稱為進棧,也稱壓棧、入棧。
棧的刪除操作稱為出棧,也稱彈棧。
2 棧的抽象數據結構
由於棧本身就是一個線性表,所以線性表的操作特性它都具備,針對它的特殊性,在它的操作上可能會有一些變化。將進棧和出棧分別改名為push和pop。
由於棧本身是一個線性表,所以線性表的順序存儲結構和鏈式存儲結構同樣適用於棧。
3 棧的順序存儲結構
用順序存儲結構存儲的棧稱為順序棧。線性表是用數組來實現的。對於棧,用下標為0的一端作為棧底比較好,因為首元素都存在棧底,變化比較小。
我們定義一個top變量來指示棧定元素在數組中的位置。若存儲棧的長度為StackSize,則棧頂位置top必需小於StackSize。當棧存在一個元素時,top等於0,因此空棧的判斷條件為top等於-1.
棧的結構定義
typedef int SElemType; typedef struct { SElemType data[MAXSIZE]; int top; //用於棧頂指針 } SqStack;
若現在有一個棧,StackSize為5,則普通棧、空棧、滿棧的情況如下圖所示。
4 進棧
對於棧的插入,即進棧操作,其實就是做了如下處理。
Status Push(SqStack *s, SElemType e) { if (s->top == MAXSIZE - 1) { //棧滿 return ERROR; } s->top ++; //棧頂指針加1 s->data[s->top] = e; //將新元素賦值給棧頂空間 return OK; }
5 出棧
Status Pop(SqStack *s, SElemType *e) { if (s->top == -1) { //空棧 return ERROR; } *e = s->data[s->top]; //將要刪除的棧頂元素賦值給e s->top --; //棧頂指針減1 return OK; }