棧的順序存儲結構


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM