佇列是只允許在一端進行插入操作,在另一端進行刪除操作的線性表
佇列是一種先進先出的線性表,允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭,假設佇列是q=(a1, a2, a3, …, an),那麼a1就是隊頭元素,an是隊尾元素,我們需要進行刪除操作時總是從a1開始,而在an後進行插入
佇列在我們的實際應用中非常頻繁,比如我們多個使用者同時訪問乙個應用的客服,客服的數量總是少於使用者的數量,當訪問客服的使用者數量大於客服的數量時我們就會看到系統提示我們前面還有多少人進行訪問,還有多少人正在排隊,這就是佇列,排在前面的使用者的問題最先被客服解決,後來的只能排在隊尾
既然佇列是一種特殊的線性表,那麼佇列也就存在順序儲存和鏈式儲存
1.我們先定義乙個陣列來作為儲存空間儲存佇列中的內容,如果乙個佇列中有n個元素,那麼我們建立的陣列的大小必須大於n,我們把佇列的所有元素都儲存在陣列的前n個單元中,陣列下標為0的一端是隊頭
入隊操作就是在元素末尾追加乙個元素,不需要移動任何元素,時間複雜度為o(1)
出隊操作需要刪除陣列下標為0的元素,為了使表頭的位置陣列下標依然為0,就需要將後面的元素全部向前移動乙個位置,這是的時間複雜度為o(n),但是其實不需要讓表頭的位置陣列下標一直為0,我們可以將表頭設定為動態,這樣出隊操作就不需要將後面的元素全部向前移動乙個位置了
2.對上面的順序表進行改進,引入兩個指標:front指標指向隊頭元素,rear指標指向隊尾元素的下乙個位置,這樣的話,當front指標等於rear時,此佇列不是還剩乙個元素,而是空佇列。
我們定義乙個空的佇列
此時front、rear指標都指向陣列下標為0的位置
我們在佇列中儲存4個元素:
為了避免這種現象的發生,對前面的兩個空位進行利用,提出了迴圈佇列的概念
接著上面的問題,當陣列最後乙個位置被占用後,我們將rear改為指向下標為0的位置
佇列已經滿了,此時rear指標和front指標已經重合了,而上面剛提到了當front指標等於rear時,此佇列不是還剩乙個元素,而是空佇列,這樣兩者就會矛盾,那麼我們到底該怎樣確定佇列已滿呢?
在佇列滿時我們可以給佇列保留乙個空位,也就是說當佇列空時front==rear;當佇列滿時,陣列中還有乙個空閒單元,此時我們認為佇列已經滿了,也就是說我們不允許上圖的情況出現
在佇列已經滿了後rear可能比front大,也可能比front小,有下面兩種情況:
儘管它們只相差乙個位置就是滿的情況,但也可能相差整整一圈,所以如果佇列的最大尺寸為queuesize,那麼佇列滿的條件是(rear + 1) % queuesize == front
,符合這個條件佇列就滿了,不符合就不滿,可以用這個條件作為迴圈終止的條件
在rear>front時,此時佇列的長度是rear-front;在rear有了佇列的長度和迴圈終止的條件後我們就可以對迴圈佇列的基本操作進行實現:
將之前的所有**刪除
# define maxsize 1000
# define ok 1
# define error 0
# define true 1
# define false 0
typedef int status;
typedef int qelemtype;
typedef structsqqueue;
在定義好了迴圈佇列後,我們就可以對迴圈佇列進行基本操作:
status initqueue(sqqueue *q)
int qelemtypelength(sqqueue q)
status enqueue(sqqueue *q, qelemtype e)
q->data[q->rear] = e;
q->rear = (q->rear + 1) % maxsize; //指標向後移動乙個位置
return ok;
}
status dequeue(sqqueue *q, qelemtype *e)
*e=q->data[q->front];
q->front = (q->front + 1) % maxsize;
return ok;
}
基本操作比較簡單,後面的部落格將會講解鏈式佇列 佇列 順序儲存
佇列是一種先進先出的線性表,允許插入的一端稱為隊尾,允許刪除的一方叫做隊頭。佇列和棧一樣,有自己的規則,使用佇列儲存資料時,只允許從一端進行插入,另一端進行刪除。需要遵循 先進先出 的規則。按照以往的做法,頭指標都在下標0的位置,那也就意味著,佇列的所有元素都要向前挪動,以保證佇列的隊頭,可是有時想...
佇列順序儲存
ifndef status h define status h define ok 1 define error 0 define false 1 define true 1 typedef int elemtype typedef int status endif ifndef stack h d...
訊息佇列概述及應用場景
訊息 是在兩台計算機間傳送的資料單位,訊息可以非常簡單,例如只包含文字字串 也可以更複雜,可能包含嵌入物件。訊息被傳送到佇列中。當中間人。佇列的主要目的是提供路由並保 證訊息的傳遞 如果傳送訊息時接收者不可用,訊息佇列會保留訊息,直到可以成功地傳 遞它。1.1 訊息生產者 訊息者 佇列 主題 訊息生...