與棧相反,佇列是一種先進先出的線性表,它只允許在表的一端進行,而在另一端刪除元
素。
在佇列中,允許插入的一端叫做隊尾,允許刪除的一端則稱為隊頭。
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...