(二)棧和隊列的順序存儲結構


- 棧

  • 順序棧,即棧的順序存儲結構是利用一組地址連續的存儲單元依次存放自棧底到棧頂的數據元素,同時附設指針top指示棧頂元素在順序棧中的位置。通常的習慣做法是以top=0表示空棧。由於棧在使用過程中所需最大空間的大小很難估計,因此,一般來說,在初始化設空棧時不應限定棧的最大容量。一個較合理的做法是:先為棧分配一個基本容量,然后在應用過程中,當棧的空間不夠使用時再逐段擴大。為此,可設定兩個常量:STACK_INIT_SIZE(存儲空間初始分配量)和 STACKINCREMENT(存儲空間分配量),並以下述類型說明作為順序棧的定義。
    typedef struct{
      SElemType * base;
      SelemType * top;
      int stacksize;
    }SqStack;
    
    stacksize:指示棧的當前可使用的最大容量。
    base:棧底指針
    top:棧頂指針

    棧的初始化操作為:按設定的初始化分配量進行第一次存儲分配,base棧底指針,在順序棧中,它始終指向棧底的位置,若base值為NULL,則表明棧結構不存在。top為棧頂指針其初始值指向棧底,即top=base可作為棧空的標記,每當插入新的棧頂元素時,指針top增1;刪除棧頂元素時,指針top減1,因此,非空棧中的棧頂指針始終在棧頂元素的下一個位置上。如下圖:

- 隊列

  • 循環隊列,和順序棧類似,在隊列的順序存儲結構中,除了用一組地址連續的存儲單元依次存放在隊列頭到隊列尾的元素之外,尚需附設兩個指針front和rear分別指示隊列頭元素和隊列尾元素位置。初始化建空隊列時,令front = rear = 0,每當插入新的隊列尾元素時,“尾指針增1”;每當刪除隊列頭元素時,“頭指針增1”。因此,在非空隊列中,頭指針始終指向隊列頭元素,而尾指針始終指向隊列尾元素的下一個位置。
    • 假設當前隊列分配的最大空間為5,則當隊列處於(d)的狀態時不可再繼續插入新的隊列元素,否則會因數組越界而遭致程序代碼被破壞。然而此時又不宜入順序棧那樣,進行存儲再分配擴大數組空間,因為隊列的實際可用空間並未占滿。因此,巧妙的將順序隊列臆造為一個環狀的空間,稱之為循環隊列。 

    • 指針和隊列元素之間的關系不變,繼續插入,隊列空間均被占滿,如下圖所示,此時front = rear;反之,相繼刪除,使隊列呈“空”的狀態,此時也滿足front = rear,因此通過front = rear無法判斷隊列是“空”還是“滿”。可有兩種處理方法:其一是另設一個標志位以區別隊列是“空”還是“滿”;其二是少用一個元素空間,約定以“隊列頭指指針在隊列尾指針的下一位置(指環狀的下一位置)”上作為隊列呈“滿”狀態的標志。因此,如果應用程序中設有循環隊列,則必須為它設定一個最大隊列長度;若無法預估所用隊列的最大長度,則宜采用鏈隊列。

目錄


免責聲明!

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



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