棧和隊列都來自線性表數據結構,都是“操作受限”的線性表
棧
1.定義:是限制在表的一端進行插入和刪除操作的線性表。后進先出LIFO線性表
2. 注意點:
棧頂(Top):允許進行插入、刪除操作的一端,又稱為表尾。用棧頂指針(top)來指示棧頂元素。
棧底(Base):是固定端,又稱為表頭
棧——順序存儲
定義:棧的順序存儲結構,用一維數組來存儲棧。根據數組是否可以根據需要增大,又可分為靜態順序棧和動態順序棧。
棧——動態順序存儲
1. 注意點:
◆ 用top=bottom作為棧空的標記
◆ 結點進棧時,首先將數據元素保存到棧頂(top所指的當前位置),然后執行top加1,使top指向棧頂的下一個存儲位置
◆ 結點出棧時,首先執行top減1,使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指向棧頂在數組中的存儲位置
◆ 結點進棧時,首先執行top加1,使top指向新的棧頂位置,然后將數據元素保存到棧頂(top所指的當前位置)。
◆ 結點出棧時,首先把top指向的棧頂元素取出,然后執行top減1,使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所指的位置,然后rear加1。
◆ 出隊:刪去front所指的元素,然后加1並返回被刪元素。◆ 隊空:front=rear。◆ 隊滿:rear=MAX_QUEUE_SIZE-1或front=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;