09 迴圈佇列與鏈佇列

2021-06-28 03:24:56 字數 3103 閱讀 5598

一、佇列與迴圈佇列

(嵌入式_小j的天空)

1.佇列

(1)佇列(queue)是只允許在一端進行插入操作

,而在另一端進行

刪除操作

的線性表。佇列是一種先進先出(fiirst in first out)的線性表,簡稱fifo。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。

從佇列的定義可知,佇列的入隊操作,其實就是在隊尾追加乙個元素,不需要移動任何元素,因此時間複雜度為o(1)。佇列的刪除操作,與棧不同的是,佇列元素的出列是在隊頭,即小標為0的位置,若要刪除乙個元素的話,需要移動佇列的所有元素,因此事件複雜度為o(n)。

(2)front/rear指標:為了避免當只有乙個元素時,隊尾和隊頭重合使處理變得麻煩,所有引入兩個指標,front指標指向隊頭元素,rear指標指向隊尾元素的下乙個位置

,這樣當front等於rear時,隊列為空(空佇列)而不是佇列還剩下乙個元素。

2.佇列的抽象資料型別

adt 佇列

data

同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係。

operation

initqueue(*q):   初始化操作,建立乙個空佇列q.

destoryqueue(*q):若佇列q存在,則銷毀它。

clearqueue(*q):將佇列q清空

gethead(q,*e):若佇列q存在且非空,用e返回佇列q的隊頭元素。

enqueue(*q,e):若佇列q存在且非空,插入新元素e到佇列q中並稱為隊尾元素。

dequeue(*q,*e):刪除佇列q中隊頭元素,並用e返回其值

queuelength(q):返回佇列q的元素個數

endadt

3.迴圈佇列

(1)定義

:佇列中頭尾相接的順序儲存結構稱為迴圈佇列,用於解決"假溢位"問題。

(2)隊滿條件

一般情況,當front=rear時,佇列可能為空佇列也可以為滿佇列。所以我們假設,當front==rear時隊列為空;當佇列滿時,陣列還有乙個空閒空間。由於rear可能比front大,也可以比front小。我們這樣定義,當佇列滿足條件"(rear+1)%queuesize==front"時,我們就認為佇列已滿(queuesize為佇列最大儲存容量)。

(3)佇列長度公式

當rear>front時,佇列的長度為rear-front;當rear

(rear-front+queuesize)%queuesize

(4)迴圈佇列的順序儲存結構

typedef int qelemtype

typedef struct

sqqueue;

(5)迴圈佇列的相關操作

a.初始化乙個迴圈佇列q

status initqueue(sqqueue *q)

b.計算迴圈佇列的長度

/*返回q的元素個數,即佇列的當前長度*/

int queuelength(sqqueue q)

c.迴圈佇列插入操作

實現:若佇列未滿,則插入元素e為新的隊尾元素

status enqueue(sqqueue *q,qelemtype e)

d.迴圈佇列刪除操作

實現:若佇列不空,則刪除q中隊頭元素。用e返回其值

status enqueue(sqqueue *q,qelemtype *e)

qnode,*queueptr;

/*佇列的鍊錶結構*/

typedef  struct

linkqueue;

3.鏈佇列的入隊操作

演算法:實質為鍊錶尾插入結點,尾指標指向新結點 a.

為新結點s開闢一段空間,並判斷是否儲存分配成功;

b.將插入元素存到新結點s的資料域,並初始化s的指標域; c.

把擁有元素e新結點s賦值給原佇列結點的後繼; d.

把當前的s設定為隊尾結點,rear指向s

實現:插入元素e為q的新隊尾元素

status enqueue(linkqueue *q,qelemtype e)

4.鏈佇列的刪除操作演算法:實質是頭結點的後繼結點出隊

,將頭結點的後繼改為他後面的結點。若煉表除頭結點外,只剩下乙個元素時,則需將rear指向頭結點。

a.定義乙個

queueptr結點p,用於暫存欲刪除的結點q->front-next;

b.將欲刪除結點資料域資料賦值給e;

c.將欲刪除結點的後繼結點(

p->next

)賦值給頭隊頭結點的後繼(

q->front->next)

d.判定

若隊頭是隊尾,則刪除後將rear指向頭結點,最後再釋放欲刪除結點p.

實現:若佇列不空,刪除q的隊頭元素,用e返回其值,並返回ok,否則返回error

status enqueue(linkqueue *q,qelemtype e)

三、迴圈佇列與鏈佇列效能分析 1.

迴圈佇列與鏈佇列基本操作時間複雜度均為o(1);

2.迴圈佇列事先申請好空間,使用期間不釋放;鏈佇列,無需事先申請空間但是每次申請和釋放結點會存在一些事件開銷;

3.迴圈佇列必須有乙個固定的長度,可能存在空間浪費;鏈佇列需要乙個指標域,會產生一些空間上的開銷,所以在可以確定佇列長度最大值的情況下建議用迴圈佇列。

09 迴圈佇列與鏈佇列

一 佇列與迴圈佇列1.佇列 1 佇列 queue 是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。佇列是一種先進先出 fiirst in first out 的線性表,簡稱fifo。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。從佇列的定義可知,佇列的入隊操作,其實就是在隊尾追加乙個元...

佇列 迴圈佇列與鏈佇列比較

對於迴圈佇列與鏈佇列的比較,可以從兩方面來考慮 1 從時間上,其實它們的基本操作都是常數時間,即都為0 1 的,不過迴圈佇列是事先申請好空間,使用期間不釋放,而對於鏈佇列,每次申請和釋放結點也會存在一些時間開銷,如果入隊出隊頻繁,則兩者還是有細微差異。2 對於空間上來說,迴圈佇列必須有乙個固定的長度...

佇列 迴圈佇列與鏈隊

2.鏈隊 注意 佇列也是線性表,其特殊性在於有特殊的運算規則。即 隊結構只能在一端進行插入,該操作端稱為隊尾,另一端刪除元素,該操作端稱為隊頭。按照 先進先出 first in first out,fifo 原則處理資料節點。之所以用迴圈對列,就是了為了提高利用率。要不然每刪除乙個元素,對頭就空了乙...