棧和隊列總結


棧和隊列都來自線性表數據結構,都是“操作受限”的線性表

                           

1.定義是限制在表的一端進行插入和刪除操作的線性表。后進先出LIFO線性表

 

 

 

2. 注意點

棧頂(Top):允許進行插入、刪除操作的一端,又稱為表尾。用棧頂指針(top)來指示棧頂元素。

棧底(Base):是固定端,又稱為表頭

 

 

                           ——順序存儲

定義棧的順序存儲結構,用一維數組來存儲棧。根據數組是否可以根據需要增大,又可分為靜態順序棧動態順序棧

 

                           ——動態順序存儲

1. 注意點

 ◆ top=bottom作為棧空的標記

 ◆ 結點進棧時,首先將數據元素保存到棧頂(top所指的當前位置),然后執行top1,使top指向棧頂的下一個存儲位置

 

 ◆ 結點出棧時,首先執行top1,使top指向棧頂元素的存儲位置,然后將棧頂元素取出

 ◆ 若棧的數組有Maxsize個元素,則top=Maxsize棧滿

 

2. 結構體定義

typedef struct SqStack
{   ElemType  *bottom;     /*  棧不存在時值為NULL  */
    ElemType  *top;      /*  棧頂指針  */
    int stacksize ;      /*  當前已分配空間,以元素為單位  */
}SqStack;

 

3. 追加存儲空間操作

// 在壓棧操作中
if(S.top-S.bottom>=S. stacksize-1){
    //  棧滿,根據存儲空間增量,追加存儲空間 
    S.bottom=(ElemType *)realloc((S.STACKINCREMENT+STACK_SIZE) *sizeof(ElemType));   
    if ( !S.bottom)  
        return  ERROR; 
    // 存儲空間追增后,棧頂指針的位置
    S.top=S.bottom + S. stacksize;
    S.stacksize+=STACKINCREMENT;
}
// 空間追贈完畢后,對於壓棧操作,直接賦值元素到 S.top 即可  
*S.top=e;
S.top++; 

 

 

 

                           ——靜態順序存儲

1. 注意點

 ◆ top=0表示棧空,每次top指向棧頂在數組中的存儲位置

 ◆ 結點進棧時,首先執行top1,使top指向新的棧頂位置,然后將數據元素保存到棧頂(top所指的當前位置)

 ◆ 結點出棧時,首先把top指向的棧頂元素取出,然后執行top1,使top指向新的棧頂位置。

 

 ◆ 若棧的數組有Maxsize個元素,則top=Maxsize-1棧滿

2.結構體定義

typedef struct SqStack{  
    ElemType stack_array[MAX_STACK_SIZE] ;
    int top,bottom;
}SqStack;

3. 上下溢:

棧滿時做進棧,定產生溢出,簡稱上溢” —— 上溢是一種出錯狀態

棧空時做退棧,將產生溢出,簡稱下溢” —— 下溢可能是正常現象

 

 

 

                           ——鏈序存儲

1. 定義鏈式存儲結構稱為鏈棧,是運算受限的單鏈表。其插入和刪除操作只能在表頭位置上進行。因此,鏈棧沒有必要像單鏈表那樣附加頭結點,棧頂指針top就是鏈表的頭指針

 

 

 

2. 注意點

◆ top == NULL

top 所指,即棧頂元素

 

3. 棧的應用

◆ 進值轉換

◆ 括號匹配

◆ 遞歸調用:

1)有效的遞歸調用函數應包括兩部分:遞推規則  終止條件

2)遞歸:一個函數直接或間接地調用自己本身

 

                           隊列

1.定義隊列是運算受限的線性表。是一種先進先出FIFO的線性表。只允許在表的一端進行插入,而在另一端進行刪除。

① 隊首(front) :允許進行刪除的一端稱為隊首。

② 隊尾(rear) :允許進行插入的一端稱為隊尾

 

                           隊列——順序存儲結構

1. 定義利用一組連續的存儲單元(一維數組) 依次存放從隊首到隊尾的各個元素,稱為順序隊列

2. 結構體定義

typedef  struct  queue{      
    ElemType   Queue_array[MAX_QUEUE_SIZE];
    int  front;
    int  rear;
}SqQueue;

 

3. 注意點

◆ 初始化:front=rear=0入隊:將新元素插入rear所指的位置,然后rear1

出隊:刪去front所指的元素,然后加1並返回被刪元素。隊空front=rear。◆ 隊滿rear=MAX_QUEUE_SIZE-1front=rear

 

 

 

4. 假溢出

在入隊和出隊操作中,頭、尾指針只增加不減小,致使被刪除元素的空間永遠無法重新利用

 

 

                           循環隊列

1.避免“假溢出”思想:

當隊首、隊尾指針指向上界(MAX_QUEUE_SIZE-1)時,其加1操作的結果是指向向量的下界0

 

2. 用模運算簡化操作:

i=(i+1)%MAX_QUEUE_SIZE

◆ i代表隊首 (front)或隊尾 (rear)

 

3. 注意點

rear所指的單元始終為空

◆ 循環隊列front=rear 

◆ 循環隊列滿(rear+1)%MAX_QUEUE_SIZE =front

入隊:先賦值,再隊尾指針移動rear=(rear+1)% MAX_QUEUE_SIZE

出隊:先值,再隊首指針移動 front=(front+1)% MAX_QUEUE_SIZE

 

 

                           隊列——鏈序存儲結構

1.定義鏈隊列,是限制僅在表頭進行刪除操作和表尾進行插入操作的單鏈表

2.結構體定義:

1)數據元素結點:

typedef struct Qnode{  
    ElemType    data;
    struct Qnode  *next;
}QNode;

2)指針結點:

typedef struct link_queue{   
    QNode  *front ,  *rear;
}Link_Queue;

 

 

 


免責聲明!

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



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