資料結構與演算法4 佇列

2022-03-07 02:05:31 字數 3623 閱讀 3727

佇列

佇列的定義

佇列的基本操作

1.初始化佇列 initqueue(&q) 將佇列q設定成乙個空佇列。

2.入佇列 enqueue(&q,x) 將元素x插入到隊尾中,也稱「進隊」 ,「插入」。

3.出佇列 outqueue(&q,&e) 將佇列q的隊頭元素刪除,並用e返回其值,也稱「退隊」、「刪除」。

4.取隊頭元素 gethead(q,&e) 得到佇列q的隊頭元素之值,並用e返回其值。 5.判隊空 queueempty(q) 判斷佇列q是否為空,若為空返回1,否則返回0。

佇列的順序實現

在非空佇列裡,頭指標始終指向隊頭元素,而尾指標始終指向隊尾元素的下一位置。

#define maxsize  100typedef 

intdatatype;

typedef

struct

queue;

順序佇列( maxsize=4 )的幾種狀態:

(1)表示空佇列, rear==front==0。 (4)a出隊後,rear==front==3。再插入元素時,會出現假溢位的情況。

克服假溢位的方法:

(1)將佇列中的所有元素均向最前端的位置移動;

(2)採用迴圈佇列。

迴圈佇列

迴圈佇列的物理儲存未發生任何改變,其只是充分利用陣列空間,想象將陣列的首尾連線起來,形成乙個迴圈佇列。

(a)表示空佇列, rear==front==0。

(b)元素a入隊後, rear==1, front==0。

(c)b,c依次入隊後, rear==3, front==0。

(d)a,b,c出隊後, front==3 ,rear==3。佇列又為空

所以,迴圈隊列為空的判定條件為:front==rear;

基本實現

#include"

stdio.h

"#include

"stdlib.h

"#define maxsize 100typedef

intdatatype;

typedef

struct

queue;

//初始化佇列

void initqueue(queue *q)

//入隊

int inqueue(queue *q,datatype x)

//判斷空佇列

int emptyqueue(queue *q)

//出隊

int outqueue(queue *q,datatype *x)

//取隊頭元素

int gethead(queue *pq,datatype *px)

*px=pq->data[(pq->front+1)%maxsize];

return1;

}

迴圈佇列中的常用判斷語句(1)佇列判空條件:rear==front;

(2)佇列判滿條件:(rear+1)%maxsize==front;

(3)入隊操作:

第①步,先判斷佇列是否已滿;

第②步,rear=(rear+1)%maxsize;

第③步:尾指標位置賦值相應元素;

(4)出隊操作:

第①步,先判斷佇列是否已空;

第②步,front=(front+1)%maxsize;

(5)計算迴圈佇列中元素的個數: 分兩種情況討論,如圖所示:

所以:(rear-front+maxsize)%maxsize。

佇列的鏈式表示和實現

佇列的鏈式儲存結構簡稱為鏈隊。它實際上是乙個同時帶有首指標和尾指標的單鏈表。頭指標指向表頭結點,而尾指標則指向隊尾元素。

鏈隊結構示意圖:

鏈隊的資料型別定義如下:

typedef int

datatype;

typedef

struct

qnodeqtype;

typedef

struct

qptrlinkqueue;

linkqueue lq;

鏈隊運算指標變化情況:

c語言實現:

#include"

stdio.h

"#include

"malloc.h

"typedef

int datatype; //

定義佇列型別

//定義隊結點

typedef struct

node

qnode;

//鏈隊結點型別

typedef

struct

linkqueue; //

初始化隊

int initqueue(linkqueue *q)

//判斷隊空

int emptyqueue(linkqueue *q)

//進隊

void inqueue(linkqueue *q,datatype x)

//出隊

int outqueue(linkqueue *q,datatype *e)

view code

佇列的應用:

線性表、棧與隊的異同點

相同點

邏輯結構相同,都是線性的;都可以用順序儲存或鍊錶儲存;棧和佇列是兩種特殊的線性表,即受限的線性表(只是對插入、刪除運算加以限制)。

不同點

①運算規則不同,線性表為隨機訪問,而棧是只允許在一端進行插入和刪除運算,因而是後進先出表lifo;佇列是只允許在一端進行插入、另一端進行刪除運算,因而是先進先出表fifo。

②用途不同,線性表比較通用;堆疊用於函式呼叫、遞迴和簡化設計等;佇列用於離散事件模擬、多道作業處理和簡化設計等。

資料結構與演算法(13) 佇列

定義 佇列是一種只能在一端插入 隊尾 在另一端刪除 隊首 的有序線性表。佇列的第乙個插入的元素也是第乙個被刪除的元素。所以,佇列是一種先進先出 fifo,first in first out 或後進後出 lilo,last in last out 線性表。佇列操作的專有名稱 向佇列中插入乙個元素,稱...

資料結構與演算法 6 佇列

引導 今天我們進入最後一章資料結構的學習 佇列。通過前面幾篇的學習,我們已經了解到了陣列,鍊錶,棧等資料結構。資料結構就是堆特定問題進行抽象話的東西,內容並不多。後面就開始介紹利用這些基礎的資料結構加上演算法來解決特定的問題。佇列佇列和棧都是抽象的資料結構,是乙個操作受限的線性表。它的特點就是先進先...

演算法與資料結構 二 佇列

佇列也是一種線性的資料結構,它與鍊錶的區別在於鍊錶可以在任意位置進行插入刪除操作,而佇列只能在一端進行插入,另一端進行刪除。它對應於現實世界中的排隊模型。佇列有兩種常見的實現方式 基於列表的實現和基於陣列的實現 基於鍊錶的佇列,我們需要儲存兩個指標,乙個指向頭節點,乙個指向尾節點。這種佇列不存在佇列...