佇列 基本概念 順序佇列

2021-07-05 23:54:58 字數 3106 閱讀 8414

一、基本概念

佇列(queue)是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。

佇列是一種先進先出(first in first out)的線性表,簡稱fifo。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。

佇列基本操作:

initqueue()     ——初始化佇列

enqueue() ——進佇列

dequeue() ——出佇列

isqueueempty() ——判斷佇列是否為空

isqueuefull() ——判斷佇列是否已滿

佇列可以由陣列和鍊錶兩種形式實現佇列操作。分別稱為順序佇列和鏈佇列。

順序佇列:順序儲存的佇列。

鏈佇列:鏈式儲存的佇列,長度沒限制。

二、順序佇列

我們一直都是用陣列來實現順序儲存的,順序佇列也不例外。所以我們可以定義乙個陣列int data[maxsize]來儲存佇列的元素。另外,我們還需要兩個指標,來標記隊頭和隊尾。

實現要點:

(1)順序佇列初始化:就是把隊頭和隊尾都歸0,也就是q->front=0; q->rear=0;

(2)入隊的演算法應該怎麼寫?佇列是線性表,用陣列實現,因此首先要判斷佇列是不是滿的。

如何判斷乙個佇列是否滿的?

假設我們在軍訓中排隊,每個人報數。乙個佇列只能站10個人,從1報到10,隊就滿了。後來呢,隊頭的兩個人出隊了,然後又補充了兩個新隊員,那麼這時候的報數是3到12。這時佇列也是滿的。兩種情況下判斷隊滿的條件分別為:

(10 + 1) mod

10 = 1

(12 + 1) mod

10 = 3

所以佇列滿的條件就是 :

(q->rear+1)%maxsize == q->front
(3)如果隊不滿,我們就可以入隊了。

思路就是,先給隊尾元素賦值,然後再將隊尾指標向後移動一位。

比如從空佇列開始,此時 q->front == q->rear,這個時候插入元素的話,其實就是給 data[q->rear] 賦值 e;然後隊尾指標 q->rear 向後移動一位重新賦值,使用

q

->

rear = (q

->

rear+1)%maxsize;

即可完成尾指標後移。入隊操作:

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

status enqueue(sqqueue *q,qelemtype e)

(4)出隊操作 。

首先,佇列空的判斷依據:q->front == q->rear

只要將隊頭指標向後移動一位就可以完成出隊q->front=(q->front+1)%maxsize;

在這之前需要用 e 來儲存出隊的元素。出隊函式如下:

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

status dequeue(sqqueue *q, qelemtype *e)

(5)置空順序佇列。只要讓隊頭指標與隊尾指標相等即可。

/* 將q清為空佇列 */

status clearqueue(sqqueue *q)

(6)獲取佇列長度。可以使用模運算來獲取佇列的長度。具體演算法:隊尾指標 - 隊頭指標 + 陣列長度的和再模陣列長度即可。

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

int queuelength(sqqueue q)

順序佇列實現**如下:

#include 

using

namespace

std;

#define maxsize 20 /* 儲存空間初始分配量 */

typedef

int qelemtype;

//迴圈佇列順序儲存結構

typedef

struct

sqqueue;

//佇列初始化函式

void initqueue(sqqueue *q)

//判斷佇列是否為空

bool isempty(sqqueue *q)

//判斷佇列是否已滿

bool isfull(sqqueue *q)

//獲取佇列長度

void queuelength(sqqueue *q)

}//出隊

void dequeue(sqqueue *q)

}//將佇列清空

void clearqueue(sqqueue *q)

//列印佇列

void printqueue(sqqueue *q)

}}int main()

結果:

1

1 21 2 3

1 2 3 4

佇列長度:4

delete x=123

4delete x=234

佇列長度:2

請空佇列!

佇列長度:0

隊列為空,無法輸出!

process returned 0 (0x0) execution time : 5.301 s

press any

keyto

continue.

順序表 順序棧 順序佇列的基本概念

自定義的資料內容data typedef struct data 順序表typedef struct sqlist 順序表建立只需用 base 去 new乙個足夠的空間 sqlist l l.base new data maxsize 並設初始長度 l.length 0 順序表可以隨機訪問 l.ba...

訊息佇列(Message Queue)基本概念

之前做日誌收集模組時,用到flume。另外也有的方案,整合kafaka來提公升系統可擴充套件性,其中涉及到訊息佇列當時自己並不清楚為什麼要使用訊息佇列。而在我自己提出的原始日誌採集方案中不適用訊息佇列時,有幾個基本問題 1.日誌檔案上傳過程,有個基本的生產者 消費者問題 2.另外系統崩潰時,資料丟失...

訊息佇列技術之基本概念

最近一直在總結azure messaging servicebus messaging相關的技術 訊息順序 訊息持久化 複雜物件訊息的序列化 訊息事務 訊息回執等機制。感覺有必要補充一篇訊息佇列技術的基本概念,無論rabbitmq activemq還是其他,都有的一些基本概念 術語 機制,分享給大家...