筆記 順序佇列

2021-08-09 03:56:51 字數 3690 閱讀 3261

三佇列的順序儲存實現

和棧相反,佇列說一種先進先出(縮寫為fifo)的線性表。它只允許在表的一端進行插入,在另一端除元素。在佇列中,允許插入的一端叫隊尾,允許刪除的一端則成為隊頭。

還有一種限定性的資料結構說雙端佇列。雙端佇列是限定插入和刪除操作中表的兩端進行的線性表。

佇列的常用操作包括:

順序佇列通常採用一維陣列一依次存放從隊頭到隊尾的元素。同時,使用兩個指標分別指示陣列中存放的某乙個元素和最後乙個元素的位置。其中指向第乙個元素的指標被稱為隊頭指標front,指向最後乙個元素的指標被稱為隊尾指標rear。

在使用佇列前,先初始化佇列,此時隊列為空,隊頭指標front和隊尾指標rear都指向佇列的第乙個位置,即front=rear=0。

每乙個元素進入佇列,隊尾指標rear會增1。

每乙個元素出佇列時,隊頭指標front會增1。

假溢位:在對順序佇列進行插入和刪除操作的過程中,可能會出現「假溢位」現象。經過多次插入和刪除操作後,實際上佇列還有儲存空間,但是又無法向佇列中插入元素,我們將這種溢位稱為「假溢位」。

為了充分利用儲存空間,消除這種「假溢位」現象,當隊尾指標rear和隊頭指標front到達儲存空間的最大值的時候,讓隊尾指標和隊頭指標轉化為0,這樣就可以把元素插入到佇列還沒有利用的儲存單元中。這樣就可以把順序佇列使用的儲存空間構造成乙個邏輯上首尾相連的迴圈佇列,可以通過取餘操作實現佇列的邏輯上的首尾相連。

初始化建空佇列時,令front=rear=0,每當插入新的佇列元素時,尾指標增1;每當刪除佇列頭元素時,頭指標增。因此,在非空佇列中,頭指標始終指向佇列頭元素,而尾指標時鐘指向佇列尾元素的下乙個位置。

僅憑等式q.front=q.rear無法判別佇列空間時空還是滿。可有兩種處理方法:其一時另設乙個標誌位以區別佇列時空還是滿;其二是少用乙個元素空間,約定「佇列頭指標在佇列尾指標的下一位置上」作為佇列呈「滿」狀態的標誌。

如果使用者的應用程式中設有迴圈佇列,則必須為它設定乙個最大佇列長度;若使用者無法預估所用的佇列的最大長度,則宜採用鏈佇列。

常用的確定隊首位置,隊尾位置,佇列長度的語句:

q.front=(q.front+1)%maxqsize;

q.rear=(q.rear+1)%maxqsize;

(q.rear-q.front+maxqsize)%maxqsize;

#define queuesize 12

typedef

struct squeueseqqueue;

void initqueue(seqqueue *sq)    

/*將順序佇列初始化為空佇列只需要把隊頭指標和隊尾指標同時置為0*/

int queueempty(seqqueue sq)   

/*判斷佇列是否為空,隊列為空返回1,否則返回0*/

int enqueue(seqqueue *sq,datatype x)   

/*將元素x插入到順序佇列sq中,插入成功返回1,否則返回0*/

int dequeue(seqqueue *sq,datatype *e)

/*刪除順序佇列中的隊頭元素,並將該元素賦值給e,刪除成功返回1,否則返回0*/

}

int gethead (seqqueue sq,datatype *e)

/*取隊頭元素,並將該元素賦值給e,取元素成功返回1,否則返回0*/

}

int clearqueue(seqqueue *sq)

/*清空佇列*/

void printqueue(seqqueue sq)

printf("\n");

}

void main()

else

break;

case

2: if(!queueempty(q))

break;

case

3: default:

printf("程式結束!");

/*將順序佇列初始化為空佇列只需要把隊頭指標和隊尾指標同時置為0*/

int queueempty(seqqueue sq)   

/*判斷佇列是否為空,隊列為空返回1,否則返回0*/

int enqueue(seqqueue *sq,datatype e)

/*將元素x插入到順序佇列sq中,插入成功返回1,否則返回0*/

int dequeue(seqqueue *sq,datatype *e)

/*刪除順序佇列中的隊頭元素,並將該元素賦值給e,刪除成功返回1,否則返回0*/

}

int gethead (seqqueue scq,datatype *e)

/*取隊頭元素,並將該元素賦值給e,取元素成功返回1,否則返回0*/

}

int clearqueue(seqqueue *scq)

/*清空佇列*/

void displayqueue(seqqueue sq)

/*順序迴圈佇列的顯示輸出函式。首先判斷佇列是否為空,輸出時還應考慮隊頭指標和隊尾指標值的大小問題*/

詳情參加博文【練習】舞伴配對問題

佇列 順序佇列

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

迴圈佇列 順序佇列

在前兩篇中講述了順序佇列中的隊頭移動與不移動兩種順序佇列,今天討論順序佇列中的迴圈佇列,這種迴圈佇列是用一維陣列實現的。在隊頭移動的情況下,根據元素個數與佇列容量之間的數量關係來解決假溢位問題。從上圖中我們可以理解為什麼這種佇列結構可以解決假溢位問題,但是隨之而來,我們要如何判定迴圈佇列已滿呢?在此...

佇列 順序迴圈佇列

順序佇列 sequence queue 用一片連續的儲存空間來儲存佇列中的資料元素.用一維陣列來存放順序佇列中的資料元素。隊頭位置設在陣列下標為 0 的端,用 front 表示 隊尾位置設在陣列的另一端,用 rear 表示。front 和 rear 隨著插入和刪除而變化。當隊列為空時,front r...