最近開始學習王爭老師的《資料結構與演算法之美》,通過總結再加上自己的思考的形式記錄這門課程,文章主要作為學習歷程的記錄。
佇列跟棧一樣,也是一種操作受限的線性表資料結構(如下圖所示),其滿足先進者先出。佇列最基本的操作時入隊enqueue(),即放乙個資料到佇列尾部;出隊dequeue(),從佇列頭部取乙個元素。
和棧一樣,佇列可以用陣列來實現,也可以通過鍊錶來實現。用陣列實現的棧叫做順序棧,用鍊錶實現的棧叫做鏈式棧。同樣,用陣列實現的佇列叫做順序佇列,用鍊錶實現的佇列叫做鏈式佇列。
對於棧來說,我們只需要乙個棧頂指標。但佇列需要兩個指標:乙個是head指標,指向隊頭,乙個是tail指標,指向隊尾。如下圖所示,當a,b,c,d依次入隊後,head指標指向下標為0的位置,tail指標指向下標為4的位置。
當我們呼叫兩次出隊操作之後,佇列中head指標指向下標為2的位置,tail指標仍然指向下標為4的位置。當不斷進行入隊和出隊操作,head和tail都會持續往後移動。當tail移動到最右邊,即使陣列中還有空閒空間,也無法繼續往佇列中新增資料了。這時候就可以通過資料搬移來解決,如下圖
基於鍊錶的實現,同樣需要兩個指標:head指標和tail指標,它們分別指向鍊錶的第乙個結點和最後乙個結點。入隊時,tail->next = new_node, tail = tail ->next, 出隊時,head = head->next.
為了避免資料搬移,引入了迴圈佇列。以下圖為例,佇列長度為8,其中head=4,tail=7.
當有新元素a入隊時,我們放入下標為7的位置。此時tail=0,當再有乙個元素b入隊時,我們將b放在下標為0的位置,tail更新為1.
在迴圈佇列中,判斷隊空和隊滿的條件:若是順序佇列,那麼判斷隊滿的條件是tail和n相等,隊空的條件是tail==head;若是迴圈佇列,隊空與順序佇列相同,而隊滿則是(tail+1)%n=head
除此之外,高階的佇列結構有阻塞佇列,併發結構等。對於大部分資源有限的場景,當沒有空閒資源時,基本都可以通過「佇列」來實現請求排隊。
在學習完棧和佇列後,可以將兩者進行比較
相同點(1)均為線性結構,資料元素間具有「一對一」的邏輯關係(2)都有順序儲存和鏈式儲存兩種實現方式(3)操作受限,插入操作均在尾進行(4)插入和刪除操作都具有常數時間
不同點(1)棧刪除操作在表尾進行,具有後進先出特性;佇列的刪除操作在表頭進行,具有先進先出特性。(2)順序棧可以實現多棧空間共享,而順序佇列則不同。
舉乙個例題:有n個人圍成一圈,順序排號。從第乙個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來第幾號的那位。
l =
n = int(input("總人數為"))
j = 0
for i in range(n):
i=0while sum(l)!=1:
if l[i]!=0:
j +=1
if j%3 == 0:
l[i]=0
if i==n-1:
i=0continue
i+=1
print("剩下為第"+str(l.index(max(l))+1)+"位")
資料結構 佇列
一 佇列的迴圈陣列實現。1 初始化 空佇列。令rear front 0。2 入佇列 約定rear指向佇列尾元素的下乙個位置。入佇列時,先判斷佇列是否已滿,而後將array rear x 然後rear 3 出佇列 約定front指向佇列的首元素位置。出佇列時,先判斷佇列是否為空,而後返回隊首元素re ...
資料結構 佇列
資料參考自 資料結構c 語言描述 佇列是一種先進先出的資料結構,這與棧正好相反。下例是簡單的queue實現 queue.h檔案 ifndef queue h define queue h include include 資料元素結構 自定義 struct datatype 佇列元素最大數 const...
資料結構 佇列
code for fun created by dream whui 2015 1 25 include stdafx.h include include using namespace std define true 1 define false 0 define ok 1 define erro...