資料結構之佇列

2021-07-04 20:42:04 字數 3775 閱讀 6317

與棧相反,佇列是一種先進先出的線性表,它只允許在表的一端進行,而在另一端刪除元

素。

在佇列中,允許插入的一端叫做隊尾,允許刪除的一端則稱為隊頭。

1、鏈佇列——佇列的鏈式表示和實現

用鍊錶表示的佇列簡稱為鏈佇列,乙個鏈佇列顯然需要兩個分別指示對頭和隊尾的指標

(分別稱為頭指

針和尾指標)才能唯一確定。這裡,和線性表的單鏈表一樣,為了操作方便起

見,我們也給隊

列新增乙個頭

結點。

鏈佇列的操作即為單鏈表的插入和刪除操作的特殊情況,只是尚需修改尾指標或頭指標。

單鏈佇列——佇列的鏈式儲存結構,如下所示。

//單鏈佇列,佇列的鏈式儲存結構

typedef struct qnode

qnode,

*queueptr;

typedef struct 

linkqueue;

2、單鏈佇列的c語言操作

#include 

#include 

#define elemtype int

#define ok 1

#define error 0

//單鏈佇列,佇列的鏈式儲存結構

typedef struct qnode

qnode,

*queueptr;

typedef struct 

linkqueue;

//構造乙個空佇列

int initqueue(linkqueue *q)

q->front-

>

next

=null;q-

>rear-

>

next

=null

;return ok;}/

/銷毀佇列,q不在存在

int destroyqueue(linkqueue *q)

return ok;}/

/判斷佇列是否為空

int isemptyqueue(linkqueue *q)

//插入元素e為新的隊尾元素

int insertqueue(linkqueue *q, elemtype e)

p->data = e;

p->

next

=null;/

/如果隊列為空

if(isemptyqueue(q)

)else

return ok;}/

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

int dequeue(linkqueue *q, elemtype *e)

//注意有隊頭結點

queueptr temp;

temp = q-

>front-

>

next

;*e = temp-

>data;

q->front-

>

next

= temp-

>

next;/

/乙個元素

if(q-

>rear =

= temp)

free(temp)

;return ok;}/

/列印佇列

void printqueue(linkqueue *q)

}int main(

int argc, char *

*argv)

printf(

"插入佇列的元素為:\n");

printqueue(q)

;int e;

dequeue(q,

&e);

printf(

"隊頭元素為: %d\n"

, e)

;return 0;}

3、迴圈佇列定義

單鏈佇列時,當隊列為空時,front等於rear,現在迴圈佇列當佇列滿時,也是front等

rear,那麼如何

判斷此時的佇列究竟是空還是滿呢?

辦法一是設定乙個標誌變數flag,當front == rear,且flag = 0時為佇列空,當front 

==rear,且

flag = 1時為佇列滿;

辦法二是當佇列空時,條件就是front == rear,當隊列為滿時,我們修改其條件,保留一

個元素空間。

也就是說,佇列滿時,陣列中還有乙個空閒單元。例如下圖所示,我們就認為此

佇列已經滿了,也就是說,

我們不允許下圖中的右圖情況出現。

我們重點來討論第二種方法,由於rear可能比front大,也可能比front小,所以,儘管它

們只相差乙個

位置時就說滿的情況,但也有可能是相差整整一圈。所以,若佇列的最大尺寸為

queuesize,那麼佇列滿的

條件是(rear + 1) % queuesize == front(取模"%"的目的就說為

了整合rear與front大小為乙個問題)。比

如上面這個例子,queueszie = 5,上圖中的左圖中

front = 0,而rear = 4,(4 + 1) % 5 = 0,所以,

此時佇列滿。再看右圖,front = 2, 

而rear = 1,(1 + 1) %5 = 2,所以,此時佇列也是滿的。但是也有

例外的情況。

另外,通用的計算

佇列長度的公式為:(rear - front + queuesize) % queuesize

迴圈佇列的順序儲存結構,如下所示。

#define elemtype int

typedef struct

sqqueue;

4、迴圈佇列的c操作

#define elemtype int

#define maxsize 100

typedef struct

sqqueue;

#define ok     1

#define error 0

//初始化乙個空佇列

int initqueue(sqqueue *q)

//迴圈佇列求佇列長度

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

int queuelength(sqqueue *q)

//迴圈佇列的入隊操作

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

int enqueue(sqqueue *q, elemtype e)

q->data[q-

>rear]

= e;

//將元素e賦值給隊尾

q->rear =

(q->rear + 1) maxsize;

//rear指向後移一位置,若到最後則轉為陣列頭部

//注意

return ok;}/

/迴圈佇列的出對操作

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

int dequeue(sqqueue *q, elemtype *e)

*e = q-

>data[q-

>front];/

/將隊頭元素賦值給e

q->front =

(q->front + 1)

% maxsize;

//front指標向後一位置,若到最後,則轉到陣列頭部

return ok;}

資料結構之佇列

八 佇列 鏈式佇列 鍊錶實現 隊尾 rear 隊首 front 靜態佇列 陣列實現 必須是迴圈佇列 需要幾個引數來確定,各引數含義 1 佇列初始化 front和rear值都是0 2 佇列非空 front代表佇列第乙個元素 rear代表佇列最後乙個元素的 下乙個元素 3 佇列空 front和rear相...

資料結構之佇列

一 佇列的介紹 佇列 queue 是一種線性儲存結構。它有以下幾個特點 1 佇列中資料是按照 先進先出 fifo,first in first out 方式進出佇列的。2 佇列只允許在 隊首 進行刪除操作,而在 隊尾 進行插入操作。佇列通常包括的兩種操作 入佇列 和 出佇列。1.佇列的示意圖 佇列中...

資料結構之佇列

標籤 空格分隔 資料結構 佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。是一種先進先出 fifo first in first out...