佇列的順序儲存結構和鏈式儲存結構

2021-07-11 15:40:49 字數 2299 閱讀 3740

佇列(queue)是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表

(在隊尾進行插入操作,在對頭進行刪除操作)

。與棧相反,佇列是一種

先進先出

(first in first out, fifo)的線性表。

與棧相同的是,佇列也是一種重要的線性結構,實現乙個佇列同樣需要順序表或鍊錶作為基礎。

佇列既可以用鍊錶實現,也可以用順序表實現。跟棧相反的是,棧一般我們用順序表來實現,而佇列我們常用鍊錶來實現,簡稱為鏈佇列。

typedef struct qnode  qnode, *queueprt;
typedef struct  linkqueue;
將隊頭指標指向鏈佇列的頭結點,而隊尾指標指向終端結點。(注:頭結點不是必要的,但為了方便操作,我們加上了。)

佇列的鏈式儲存結構

空佇列時,front和rear都指向頭結點。

建立乙個佇列要完成兩個任務:一是在記憶體中建立乙個頭結點,二是將佇列的頭指標和尾指標都指向這個生成的頭結點,因為此時是空佇列。

initqueue(linkqueue *q)

入佇列操作

//入佇列操作 

insertqueue(linkqueue *q, elemtype e)

出佇列操作

出佇列操作是將佇列中的第乙個元素移出,

隊頭指標不發生改變

,改變頭結點的next指標即可。

如果原佇列只有乙個元素,那麼我們就應該處理一下隊尾指標。

出佇列操作

deletequeue(linkqueue *q, elemtype *e)

銷毀乙個佇列

由於鏈佇列建立在記憶體的動態區,因此當乙個佇列不再有用時應當把它及時銷毀掉,以免過多地占用記憶體空間。

destroyqueue(linkqueue *q)

}

佇列的順序儲存結構

我們假設乙個佇列有

n個元素,則順序儲存的佇列需建立乙個大於

n的儲存單元,並把佇列的所有元素儲存在陣列的前

n個單元,陣列下標為

0的一端則是隊頭。

入佇列操作其實就是在隊尾追加乙個元素,不需要任何移動,時間複雜度為

o(1)

。出佇列則不同,因為我們已經架設下標為0的位置是佇列的隊頭,因此每次出佇列操作所有元素都要向前移動。

在現實中也是如此,一群人在排隊買火車票,前邊的人買好了離開,後面的人就要全部向前一步補上空位。

可是我們

研究資料結構和演算法的乙個根本目的就是要想方設法提高我們的程式的效率

,按剛才的方式,出佇列的時間複雜度是o(n),效率大打折扣!

如果我們不去限制隊頭一定要在下標為0的位置,那麼出佇列的操作就不需要移動全體元素。

但是這樣也會出現一些問題,例如按下邊的情形繼續入佇列,就會出現陣列越界的錯誤。

可事實上我們有0和

1兩個下標還空著,這叫假溢位。

我們再想想,要解決假溢位的辦法就是如果後面滿了,就再從頭開始,也就是頭尾相接的迴圈。

迴圈佇列它的容量是固定的,並且它的隊頭和隊尾指標都可以隨著元素入

、出佇列而發生改變,這樣迴圈佇列邏輯上就好像是乙個環形儲存空間。

但要注意的是,在實際的記憶體當中,不可能有真正的環形儲存區,我們只是用順序表模擬出來的邏輯上的迴圈。

於是我們發覺了,似乎迴圈佇列的實現只需要靈活改變

front

和rear

指標即可。

也就是讓front或rear指標不斷加1,即

使超出了位址範圍,也會自動從頭開始。我們可以採取

取模運算

處理:(

這個運算在資料結構中特別常見,也特別重要!

)(rear+1) % queuesize

(front+1) % queuesize

取模就是取餘數的意思,他取到的值永遠不會大於除數

#define maxsize 100

typedef struct

初始化乙個迴圈佇列

initqueue(cyclequeue *q)

入佇列操作

insertqueue(cyclequeue *q, elemtype e)

出佇列操作

deletequeue(cyclequeue *q, elemtype *e)

資料結構 佇列 順序儲存結構佇列 鏈式儲存結構佇列

佇列是一種只允許在一端進行插入操作,而在另外一端進行刪除操作的線性表,特徵是先進先出,包括 順序儲存結 構佇列 鏈式儲存結構佇列。重點說明 迴圈佇列和鏈隊。在佇列中front為隊頭指標 rear為隊尾指標 佇列 佇列空的條件 rear front 佇列滿的條件 rear 1 queuesize fr...

棧的順序儲存結構和鏈式儲存結構

在表尾進行插入和刪除操作的線性表 仍然滿足線性表的操作,只是在push和pop有些區別 棧頂 top 允許插入和刪除,另一端稱棧底 bottom 不含任何資料元素的棧叫空棧。棧 後進先出 last in first out 的線性表,簡稱lifo結構。棧的插入稱為進棧,也稱壓棧,入棧。棧的刪除稱為出...

順序儲存結構和鏈式儲存結構的優缺點

一 順序儲存結構和鏈式儲存結構的優缺點 比較,以及使用情況。1 優缺點 順序儲存時,相鄰資料元素的存放位址也相鄰 邏輯與物理統一 要求記憶體中可用儲存單元的位址必須是連續的。優點 儲存密度大 1 儲存空間利用率高。缺點 插入或刪除元素時不方便。鏈式儲存時,相鄰資料元素可隨意存放,但所佔儲存空間分兩部...