以下是對資料結構中的棧和佇列的一些總結:
一、棧
棧(stack)是一種特殊的線性表,有後進先出(last in first out, lifo)的性質,且只能從線性表的一段進行插入和刪除元素等操作。
棧的常用操作有:進棧、出棧、取棧頂、將棧置空、判斷棧是否為空、判斷棧是否已滿等等。
由於棧也屬於線性表,因此線性表的儲存結構對棧也適用,因此,使用陣列或者單向鍊錶均可以實現棧。這兩種儲存結構的不同,因此實現棧的方式也有不同,形成的棧的性質也有所不同。乙個常見的區別是,在順序棧中有「上溢」和「下溢」的概念,即當棧已經滿了還存資料稱為「上溢」,棧已經空了還執行取資料操作成為「下溢」。而鏈式棧則沒有「上溢」的限制,因為可以在可操作的一頭自由增加新的結點而不會溢位。
1.線性棧
順序棧,需要設計乙個規定大小size
的陣列來儲存整個棧,設下標為0的元素就是棧底元素,用top變數來指示棧頂元素的下表,因為陣列的大小為size
,因此0 <= top < size
。當top = 0
時表示該棧只有乙個元素;當top = size - 1
時表示棧滿;同理,可以令top = -1
表示當前的棧為空棧。
2.鏈式棧
線性棧的缺點明顯,因其大小固定,因此若要入棧的元素數目無法估計則容易出現棧溢位的情況,此時應該考慮使用鏈式儲存結構,即鏈式棧。需要注意的是,鏈式棧不需要在頭部附加頭結點,因為棧都是在頭部進行操作的。
二、佇列
佇列(queue)也是一種特殊的線性表,它的限制與棧不同,在表的兩頭都有限制,插入只能在表的一端進行,只進不出;而刪除只能在表的另一端進行,只出不進。允許插入資料的一端稱為隊頭 (front),允許刪除的一端稱為隊尾(rear)。佇列的性質與棧相反,是先進先出(first in first out, fifo)的。
與棧差別不大,佇列的常用操作主要有:進隊、出隊、取對頭資料、將佇列置空、判斷佇列是否為空、判斷佇列是否已滿等等。
與棧相似,佇列也有順序儲存和鏈式儲存兩種儲存結構,分別稱為「順序佇列」和「鏈隊」。
1.順序佇列
建立順序佇列結構必須為其靜態分配或動態申請一片連續的儲存空間,並設定兩個指標進行管理。乙個是隊頭指標front,它指向隊頭元素;另乙個是隊尾指標rear,它指向下乙個入隊元素的儲存位置。
當front=rear時,佇列中沒有任何元素,稱為空佇列。每次在隊尾插入乙個元素是,rear增1;每次從隊頭刪除乙個元素時,front增1。隨著插入和刪除操作的進行,佇列元素的個數不斷變化,佇列所佔的儲存空間也在為佇列結構所分配的連續空間中移動。乙個操作的例子如下圖所示:
順序佇列中的可能出現「下溢」、「真上溢」或「假上溢」等現象,以下一一進行解釋:
「下溢」現象:當隊列為空時,做出隊運算產生的溢位現象。「下溢」是正常現象,常用作程式控制轉移的條件。
「真上溢」現象:當佇列滿時,做進棧運算產生空間溢位的現象。「真上溢」是一種出錯狀態,應設法避免。
而至於「假上溢」,回到上面舉的例子,會發現到了d步驟,當rear增加到指向分配的連續空間之外時,佇列無法再插入新元素,但這時往往還有大量可用空間未被占用,這些空間是已經出隊的佇列元素曾經占用過得儲存單元。這種情況被稱為「假上溢」現象。
使佇列空間能重複使用,往往對佇列的使用方法稍加改進:無論插入或刪除,一旦rear指標增1或front指標增1 時超出了所分配的佇列空間,就讓它指向這片連續空間的起始位置。
為了克服這種現象造成的空間浪費,可以對佇列的使用方法稍加改進:無論插入或刪除,一旦rear指標增1或front指標增1時超出了所分配的佇列空間,就讓它指向這片連續空間的起始位置,這就好比是把向量空間頭尾相接,形成乙個閉環,此時的佇列變成了乙個迴圈佇列。
迴圈佇列解決了「假上溢」的問題,但帶來乙個新的問題。上面提到,在迴圈佇列中,當隊列為空時,有front=rear,而當所有佇列空間全佔滿時,同樣有front=rear。因此還需要對佇列做一些調整才能區別這兩種情況。
區別這兩種情況的方法有多種,可以用乙個計數器記錄佇列中的元素的總數,這樣就可以隨時知道佇列的長度了,只要佇列中的元素個數等於向量空間的長度,就是隊滿。另一種方法是規定迴圈佇列最多只能有maxsize-1個佇列元素,當迴圈佇列中只剩下乙個空儲存單元時,佇列就已經滿了。因此,佇列判空的條件時front=rear,而佇列判滿的條件時front=(rear+1)%maxsize。
2.鏈式佇列
鏈式佇列與線性表的單鏈表相似,不同的是鏈式佇列只允許從頭部進行刪除、尾部進行插入。需要為鏈式佇列建立乙個頭結點包括兩個指標,指向隊頭的指標front與指向隊尾的指標rear。當兩個指標相等時隊列為空。
資料結構與演算法(棧與佇列)
棧 stack 有些地方稱為堆疊,是一種容器,可存入資料元素 訪問元素 刪除元素,他的特點在於只能允許在容器的一端 稱為棧頂端指標,英語top 進行加入資料 英語push 和輸出資料 英語pop 的運算。沒有了位置概念,保證任何時候可以訪問 刪除的元素都是此前最後存入的那個元素,確定了一種預設的訪問...
佇列 棧(資料結構與演算法)
佇列是一種先進先出 fifo 的資料結構,從隊尾進,從隊頭出 在 fifo 資料結構中,將首先處理新增到佇列中的第乙個元素。如上圖所示,佇列是典型的 fifo 資料結構。插入 insert 操作也稱作入隊 enqueue 新元素始終被新增在佇列的末尾。刪除 delete 操作也被稱為出隊 deque...
C C 資料結構與演算法 棧與佇列)
棧的鏈式儲存結構 棧的應用 遞迴 佇列棧 stack 是限定僅在表位進行插入和刪除操作的線性表。adt 棧 stack data 同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係。operation initstack s 初始化操作,建立乙個空棧s destroystack s 若棧存在,...