一、基本概念
佇列(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還是其他,都有的一些基本概念 術語 機制,分享給大家...