1. 程式人生 > >資料結構基礎02-棧和佇列

資料結構基礎02-棧和佇列

本文系列

資料結構基礎01-基本概念和術語/線性表

資料結構基礎02-棧和佇列

棧(Stack):所有的插入和刪除只在表的一端進行的線性表,即是一種操作受限的線性表。在表中,允許插入和刪除的一端叫棧頂(top),不允許插 入和刪除的另一端叫棧底(bottom)。

特點
“先進後出”或“後進先出”(LIFO,Last In First Out)。n = 0 時稱為空棧(此時棧中無任何元素)。

棧的操作
進棧(壓棧) PUSH
出棧(彈棧) POP

棧的應用
1.進位制轉換
2.括號匹配的檢驗
3.迷宮求解:若當前位置“可通”,則納入路徑,繼續前進;若當前位置“不可通”,則後退,換方向繼續探索;若四周“均無通路”,則將當前位置從路徑中刪除出去。
4.表示式求解:字首、中綴、字尾。
5.實現遞迴:多個函式巢狀呼叫的規則是:後呼叫先返回。
6.瀏覽器歷史紀錄,Android中的最近任務,Activity的啟動模式,CPU中棧的實現,Word自動儲存,解析計算式,解析xml/json。解析XML時,需要校驗節點是否閉合,節點閉合的話,有頭尾符號相對應,遇到頭符號將其放入棧中,遇到尾符號時,彈出棧的內容,看是否有與之對應的頭符號,棧的特性剛好符合符號匹配的就近原則。
7.行編輯程式

順序儲存棧: 順序儲存結構

鏈棧: 鏈式儲存結構。插入和刪除操作僅限制在鏈頭位置上進行。棧頂指標就是連結串列的頭指標。通常不會出現棧滿的情況。 不需要判斷棧滿但需要判斷棧空。

兩個棧共用靜態儲存空間,對頭使用也存在空間溢位問題。棧1的底在v[1],棧2的底在V[m],則棧滿的條件是top[1]+1=top[2]。

基本操作: 刪除棧頂元素、判斷棧是否為空以及將棧置為空棧等

對於n各元素的入棧問題,可能的出棧順序
在這裡插入圖片描述

堆疊溢位一般是迴圈的遞迴呼叫、大資料結構的區域性變數導致的
應用,程式碼:

佇列

佇列(Queue)也是一種運算受限的線性表。它只允許在表的一端進行插入,而在另一端進行刪除。允許刪除的一端稱為隊頭(front),允許插入的一端稱為隊尾(rear)。先進先出。

順序佇列: 順序儲存結構。當頭尾指標相等時佇列為空。在非空佇列裡,頭指標始終指向隊頭前一個位置,而尾指標始終指向隊尾元素的實際位置

迴圈佇列。 在迴圈佇列中進行出隊、入隊操作時,頭尾指標仍要加1,朝前移動。只不過當頭尾指標指向向量上界(MaxSize-1)時,其加1操作的結果是指向向量的下界0。除非向量空間真的被佇列元素全部佔用,否則不會上溢。因此,除一些簡單的應用外,真正實用的順序佇列是迴圈佇列。故隊空和隊滿時頭尾指標均相等。因此,我們無法通過front=rear來判斷佇列“空”還是“滿”

鏈佇列: 鏈式儲存結構。限制僅在表頭刪除和表尾插入的單鏈表。顯然僅有單鏈表的頭指標不便於在表尾做插入操作,為此再增加一個尾指標,指向連結串列的最後一個結點。

設尾指標的迴圈連結串列表示佇列,則入隊和出隊演算法的時間複雜度均為O(1)。用迴圈連結串列表示佇列,必定有連結串列的頭結點,入隊操作在連結串列尾插入,直接插入在尾指標指向的節點後面,時間複雜度是常數級的;出隊操作在連結串列表頭進行,也就是刪除表頭指向的節點,時間複雜度也是常數級的。

隊空條件: rear==front,但是一般需要引入新的標記來說明棧滿還是棧空,比如每個位置布林值

隊滿條件: (rear+1) % QueueSize==front,其中QueueSize為迴圈佇列的最大長度

計算佇列長度:(rear-front+QueueSize)% QueueSize

入隊:(rear+1)% QueueSize
出隊:(front+1)% QueueSize