佇列的定義

2021-08-21 05:35:16 字數 3471 閱讀 2935

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

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

在我們利用鍵盤進行字母數字的輸入顯示到顯示屏上其實就是利用了佇列的形式,以及當我們電腦卡死的時候,我們滑鼠亂點的操作其實都是記錄了起來,等著電腦正常的時候,這些操作又會再去繼續執行

佇列的抽象資料型別定義如下所示

adt 佇列(queue)

data

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

operation

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

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

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

queueempty(q): 若佇列q為空,返回true,否則返回false。

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

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

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

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

endadt

線性表有順序儲存和鏈式儲存,棧是線性表所以也有順序儲存和鏈式儲存這兩種儲存方式,佇列也是一種特殊的線性表,也同時存在這兩種儲存方式

對於順序儲存的佇列的入隊操作其實就是在隊尾去增加乙個元素,不需要去移動任何元素,因此時間複雜度為o(1),佇列元素的出列操作是在隊頭,也就是下標為0的位置,這就就是說如果出隊第乙個元素出隊了,其他元素都要往前移,所以這個時候空間複雜度為o(n)

當然如果我們去規定隊頭不一定在下標為0處,那麼後面也就不用移動了,但是這樣的話前面因為出隊的空間就會浪費了,這樣的話到了隊尾就真的是到了隊尾

基於此問題,我們去使用迴圈佇列的方式去解決,對於迴圈佇列的判斷如果是佇列滿的判斷就是(rear+1)%queuesize == front,如果是計算佇列的長度就是(rear-front+queuesize)%queuesize

關於迴圈佇列的定義如下所示,下面的status是int型別,ok是1是乙個巨集定義,error也是巨集定義表示0

/* qelemtype型別根據實際情況而定,這裡假設為int */

typedef

int qelemtype;

/* 迴圈佇列的順序儲存結構 */

typedef

struct

sqqueue;

初始化乙個空佇列

/* 初始化乙個空佇列q */

status initqueue(sqqueue *q)

迴圈佇列求佇列長度

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

int queuelength(sqqueue q)

迴圈佇列的入隊操作如下所示

status enqueue(sqqueue *q,qelemtype e)

//將e的值賦值給隊尾,因為這裡採取的是保留乙個元素空間的方法來判斷佇列是否滿了

q->

data

[q->rear]

=e; //rear指標向後移動乙個位置

q->rear = (q->rear+1)%maxsize;

}

佇列出隊的操作

/* 若佇列不空,則刪除q中隊頭元素,用e返回其值 */

status dequeue(sqqueue *q, qelemtype *e)

如果我們只是去對佇列使用順序儲存,不使用迴圈佇列,演算法的時間效能是不高的,但是迴圈佇列的話我們還是採取順序儲存我們就需要去考慮空間的問題怎麼去分配,所以我們可以去採取佇列的鏈式儲存結構

佇列的鏈式儲存結構,其實就是線性表的單鏈表,只不過它只能位進頭出而已,我們把它簡稱為鏈佇列,我們將隊頭指標指向鏈佇列的頭結點,將隊尾指標指向終端結點

如果是空佇列的時候,front和rear都是指向頭結點的

關於鏈佇列的結構定義如下所示

typedef

int qelemtype;

/* 結點結構 */

typedef

struct qnode

qnode, *queueptr;

/* 佇列的鍊錶結構 */

typedef

struct

linkqueue;

在佇列的鏈式儲存結構當中的入隊操作其實就是在鍊錶的尾部插入結點,就是將rear的指向往後移動乙個位置

status dequeue(linkqueue *q, qelemtype *e)

對於鏈式儲存的佇列的出隊操作如下所示

status dequeue(linkqueue *q, qelemtype *e)

一般來說如果在可以確定佇列長度最大值的情況下,建議用迴圈佇列,如果我們無法估計佇列的長度的時候,一般採取鏈佇列

佇列的定義

佇列 是一種特殊的線性表 隊頭 取出資料元素的一端 隊尾 插入資料元素的一端 佇列性質 先進先出 fifo 佇列的實現之順序儲存 復用線性表的順序儲存 include seqlist.h include seqqueue.h seqqueue seqqueue create int capacity...

佇列(queue)的定義,佇列的儲存結構

佇列定義 佇列 queue 簡稱隊,它同堆疊一樣,也是一種運算受限的線性表,其限制是僅允許在表的一端進行插入,而在表的另一端進行刪除。在佇列中把插入資料元素的一端稱為 隊尾 rear 刪除資料元素的一端稱為 隊首 front 向隊尾插入元素稱為 進隊或入隊,新元素入隊後成為新的隊尾元素 從佇列中刪除...

佇列(queue)的定義,佇列的儲存結構

佇列定義 佇列 queue 簡稱隊,它同堆疊一樣,也是一種運算受限的線性表,其限制是僅允許在表的一端進行插入,而在表的另一端進行刪除。在佇列中把插入資料元素的一端稱為 隊尾 rear 刪除資料元素的一端稱為 隊首 front 向隊尾插入元素稱為 進隊或入隊,新元素入隊後成為新的隊尾元素 從佇列中刪除...