線性表 順序佇列 迴圈佇列 雙端佇列 十三

2021-10-02 10:33:30 字數 2111 閱讀 7961

2.**實現

3.雙端佇列

1.佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。

2.佇列的資料元素又稱為佇列元素。在佇列中插入乙個佇列元素稱為入隊,從佇列中刪除乙個佇列元素稱為出隊。因為佇列只允許在一端插入,在另一端刪除,所以只有最早進入佇列的元素才能最先從佇列中刪除,故佇列又稱為先進先出(fifo—first in first out)線性表。

與順序棧相似,在佇列的順序儲存結構種,用一組位址連續的儲存單元依次存放從隊頭到隊尾的元素,如一維陣列。

由於佇列中的隊頭和隊尾的位置是實時變化的,需要兩個指標來隨時跟隨頭尾佇列。當隊列為空時,兩個指標front,rear,指向乙個位置,隨著資料入隊,兩指標的位置圖1,圖2所示。

出隊如圖3。

可以看出隨著資料出隊,陣列前面的空間像靜態鍊錶一樣被浪費,無法再利用,所以在順序佇列的基礎上,使用順序迴圈佇列,為了方便理解,我們將陣列首尾連起來,形成乙個環,如下圖所示:

在原來的頭出隊後,原來的位置可以被尾所利用,避免了記憶體浪費。我們只研究順序迴圈佇列,下面來看**實現。

#define maxsize 50

typedef

struct

seqqueue;

void

initqueue

(seqqueue * q)

int

enterqueue

(seqqueue * q,

char x)

q->elem[q->rear]

= x;

q->rear =

(q->rear +1)

% maxsize;

return

(true)

;}

有些人可能要問為什麼要進行取模這樣的演算法,我來說一下:

上面定義的陣列為50個單位,如果rear指標指向49,繼續有資料入隊,當rear指標+1變為49+1等於50,因為陣列下標最大只有49,會造成陣列越界並假溢位,此時便不應該是(rear)49繼續加1,而是應該將rear重置為0,才可解決問題,所以不採取取膜演算法也是可以的,就是將最大的長度重置為0,而其他數和取不取模最後的結果是一樣的,只是為了方便,一遍會採取取膜,(49+1)%=0,這種方法會使陣列下角標到達最大長度自動置0,省去我們多寫一步置0。

除了棧和佇列,還有一種限定性資料結構是雙端佇列,雙端佇列是限定插入和刪除操作在表的兩端進行的線性表。這兩端分別稱做端點1和端點2。也可像棧一樣,可以用乙個鐵道轉軌網路來比喻雙端佇列。在實際使用中,還可以有輸出受限的雙端佇列(即乙個端點允許插入和刪除,另乙個端點只允許插入的雙端佇列)和輸入受限的雙端佇列(即乙個端點允許插入和刪除,另乙個端點只允許刪除的雙端佇列)。而如果限定雙端佇列從某個端點插入的元素只能從該端點刪除,則該雙端佇列就蛻變為兩個棧底相鄰的棧了。這種雙端佇列看起來比棧和佇列更靈活,但是實際應用中遠不及棧和佇列常用,就不在討論。

若有錯誤,歡迎指正批評,歡迎討論。

每文一句:人生短短幾十年,不要給自己留下了什麼遺憾,想笑就笑,想哭就哭,該愛的時候就去愛,無謂壓抑自己。

佇列 雙端佇列與迴圈佇列

介面與類的繼承關係 雙端佇列 兩端都可以進行入隊和出隊操作的佇列 deque介面 linkedlist 實現類 方法 方法解釋 addfirst e ofterfirst e 入佇列 頭部元素 addlast e ofterlast e 入佇列 尾部元素 removefirst pool first...

線性表 佇列

和棧相反,佇列是一種先進先出 first in first out 縮寫為fifo 的線性表。它只允許在表的一端進行插入,而在另一端刪除元素。雙端佇列 限定插入和刪除操作在表的兩端進行的線性表 單鏈佇列 佇列的鏈式儲存表示 和線性表類似,佇列也可以有兩種儲存表示。用鍊錶表示的佇列簡稱鏈佇列。type...

佇列 雙端佇列

1.佇列 佇列是遵循先進先出 fifo,也稱為先來先服務 原則的一組有序的項。佇列在尾部新增新 元素,並從頂部移除元素。最新新增的元素必須排在佇列的末尾 class queue 向佇列新增元素 enqueue element 檢查佇列是否為空並獲取它的長度 isempty 從佇列移除元素 deque...