順序表示的佇列 順序佇列1 基本內容

2021-09-01 20:53:19 字數 2820 閱讀 9838

佇列

佇列是一種受限的線性表。它只允許在表的一端進行插入,另一端進行刪除。佇列具有「先入先出」的特性,它的應用非常廣泛,它主要應用在樹的層次遍歷、圖的廣度優先遍歷、鍵盤的輸入緩衝區、作業系統和事務管理等方面。

【定義】

佇列(queue)是一種先進先出(first in first out , fifo)的線性表,它只允許在表的一端插入元素,另一端刪除元素。其中,允許插入的一端稱為隊尾(rear),允許刪除的一端稱為對頭(front)。

乙個隊列為q=(a1,a2,...,an), 如圖

那麼a1為對頭元素,an為隊尾元素。最早進入佇列的元素也會最早出來,只有當最先進入佇列的元素都出來以後,後進入的元素才能退出。

在日常生活中,人們去銀行辦理業務需要排隊,這就類似我們提到的佇列。每乙個新來辦理業務的需要按照機器自動生成的編號等待辦理,只有前面的人辦理完畢,才能輪到排在後面的人辦理業務。新來的人進入排隊狀態就相當於入隊,前面辦理完業務離開的就相當於出隊。

佇列有兩種儲存表示:順序儲存和鏈式儲存。採用順序儲存結構的佇列被稱為順序佇列,採用鏈式儲存結構的佇列稱為鏈式佇列。

【順序佇列】

順序佇列通常採用一維陣列儲存佇列中的元素,另外增加兩個指標分別指示陣列中存放的隊首元素和隊尾元素。其中指向隊首元素的指標稱為隊頭指標front,指向隊尾元素的指標稱為隊尾指標rear。

隊列為空時,隊頭指標front和隊尾指標rear都指向下標為0的儲存單元,當元素a,b,c,d,e,f,g依次進入佇列後,元素a~g分別存放在陣列下標為0~6的儲存單元中,隊頭指標front指向元素a,隊尾指標指rear向元素g的下一位置。如圖所示。

【假溢位】

但是按照前面介紹的順序儲存方式,容易出現「假溢位」。所謂「假溢位」,就是經過多次插入和刪除操作後,實際佇列還有儲存空間,但是又無法向佇列中插入元素。

例如在圖中佇列刪除a和b,然後依次插入h、i和j,當插入j後,就會出現隊尾指標rear越出陣列的下界造成「假溢位」,如圖

【順序迴圈佇列】

當隊尾指標rear或隊頭指標front到達儲存空間的最大值時(假定佇列的儲存空間為queuesize),讓隊尾指標或者隊頭指標轉化為0,這樣就可以將元素插入到佇列的空閒儲存單元中,有效的利用儲存空間,消除「假溢位」。

例如在上面的例子中,插入元素j後,rear將變為0,這樣就將j插入下標為0的儲存單元中。這樣順序佇列的儲存空間就構成了乙個邏輯上收尾相連的迴圈佇列。

要把用陣列表示的順序佇列構成迴圈佇列,只需要乙個簡單的取餘操作即可實現。例如當隊尾指標rear=9(假設queuesize=10)時,如果要將新元素入隊,則先令rear=(rear+1)%10,這樣rear就等於0,這樣利用取餘操作就實現了佇列邏輯上的首尾相連,然後將元素存入佇列的第0號單元。

【隊空和隊滿】

在迴圈佇列中,隊空和隊滿時隊頭front和隊尾指標rear同時都會指向同一儲存單元,即front==rear,如圖所示。

隊空

隊滿 如何區分隊空和隊滿呢?有以下兩種方法:

(1)增加乙個標誌位。設標誌位為tag,初始時,tag=0;當入隊成功,則tag=1;出隊成功,tag=0。則判斷隊空的條件為:front==rear&&tag==0;隊滿的條件為:front==rear&&tag==1;

(2)少用乙個儲存單元。隊空的判斷條件為front==rear;隊滿的判斷條件為front==(rear+1)%queuesize。

隊滿的狀態如圖。

【儲存結構】

typedef struct squeue

seqqueue;

【基本運算】

(1)初始化佇列

void initqueue(seqqueue *scq)

(2)判斷佇列是否為空

int queueempty(seqqueue scq)

else

}

(3)將元素e入隊

int enqueue(seqqueue *scq, datatype e)

scq->queue[scq->rear] = e;

scq->rear = (scq->rear + 1) % queuesize;

return 1;

}

(4)隊頭元素出隊

int dequeue(seqqueue *scq, datatype *e)

else

}

(5)取隊頭元素

int gethead(seqqueue scq, datatype *e)

else

}

(6)清空佇列

void clearqueue(seqqueue *scq)

順序表示的佇列 順序佇列2 假溢位

要求順序迴圈佇列不損失乙個空間全部能夠得到有效利用,請採用設定標誌位tag的方法解決 假溢位 問題,實現順序迴圈佇列演算法。考察迴圈隊列入隊和出隊演算法思想。設定標誌位tag,初始時tag 0,當元素入隊成功,令tag 1 出隊成功令tag 0。則隊列為空的判定條件為front rear tag 0...

佇列 順序佇列

建立順序佇列結構必須為其靜態分配或動態申請一片連續的儲存空間,並設定兩個指標進行管理。乙個是隊頭指標front,它指向隊頭元素 另乙個是隊尾指標rear,它指向下乙個入隊元素的儲存位置。typedef struct queue queue,pqueue queue.h整體結構 typedef int...

佇列 基本概念 順序佇列

一 基本概念 佇列 queue 是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。佇列是一種先進先出 first in first out 的線性表,簡稱fifo。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。佇列基本操作 initqueue 初始化佇列 enqueue 進佇列 dequ...