說起佇列(queue),讓人更為熟悉的一種表述則是fifo(first in first out)。正如其含義,先進先出,資料排隊。
佇列的官方定義是這麼表述的:佇列
(queue)
是只允許再一端進行插入操作,而在另一端進行刪除操作的線性表。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。
生活中有些時候會遇到一些佇列操作的現象,比如你的電腦卡頓,點下滑鼠的操作過一段時間才會執行,這是為什麼呢?因為作業系統對於訊息的基本處理機制是按照佇列的方式入隊,然後出隊執行的。再比如銀行服務叫號機制,取號等待,那也是一種以佇列方式執行的排隊模式。佇列、堆疊,在資料結構中作為一種基本的模型,應用也頗多。
由定義知,佇列是一種線性表,那麼線性表的定義和使用有機會再說,需要注意的是線性表強調的是有限的序列,資料與資料之間像是被線串聯在一起。線性表不代表一定是空間連續,因為線性表包含順序表和煉表。鍊錶儲存空間不一定是連續的,只要除了首尾元素外所有元素有唯一前驅和後繼即可,且資料相「連」。
一、佇列的基本程式設計表述
基本操作函式(operation):
initqueue(*q); //初始化操作,一般是為佇列開闢乙個空間
destroyqueue(*q); //銷毀佇列,釋放空間
clearqueue(*q); //清空佇列資料,佇列依然存在
queueisempty(q);//判斷佇列是否為空
queueisfull(q);//判斷佇列是否已滿
gethead(q, *e);//獲取佇列首元素,即隊頭元素
enqueue(*q, e);//資料入隊操作
dequeue(*q, *e);//資料出隊操作
queuelength(q);//獲取佇列儲存的資料長度
佇列作為一種抽象的結構,不是說儲存的資料只是乙個int、char、float什麼的資料,可以是結構體型別的數,包含各種型別資料的乙個資料塊。根據實際應用的需求,寫出需要的函式即可,上面所列出來的操作只是說是常用的一些操作,未必全用,當然也可以自己再寫一些其他的特殊操作,比如你想獲取當前佇列中某乙個位置的元素,這些都是可以實現的。這些函式的命名也只是比較規範的一種總結,其實還有很多人用什麼popqueue()、pushqueue()….自己喜歡就好。
二、佇列的基本程式設計實現
陣列佇列的實現:
陣列實現佇列是比較直接的一種方式,一般會定義乙個結構體變數用於儲存陣列以及隊頭和隊尾標識。
//佇列儲存的資料型別
typedef int qelemtype;
//定義佇列結構體
typedef struct
sqqueue;
其中qelemtype 是乙個巨集觀意義上的型別,你可以定義其他結構體變數存入陣列,笨拙的辦法也可以不要這樣的結構體,你知道隊頭隊尾只是標識就好,用乙個簡單的陣列,每次存入資料,將隊尾標識加1即可,當然入隊操作你要先判斷佇列(陣列)是否已經存滿。存滿了要將陣列中資料從第二個資料開始往前移動乙個空間。覆蓋隊頭資料,這樣就可以持續存入了。出隊的效果也差不多,出隊其實就是用後面的資料移位覆蓋隊頭資料,然後把隊尾下標減1。這麼一說,其實不難發現這樣的移位操作是很不高效的,我們以迴圈移動front和rear標識來實現資料覆蓋則顯得更科學,即迴圈佇列。迴圈佇列中front和rear可以一直進行加1操作的原因是因為佇列是線性儲存,在已開闢的空間中位址是迴圈的,而不是表面意義上的數值增大。
迴圈佇列的基本實現辦法:
基本操作函式的實現
/*初始化操作,一般是為佇列開闢乙個空間*/
sqqueue * initqueue(void)
/*獲取佇列儲存的資料長度*/
unsigned char queuelength(sqqueue *q)
/*資料入隊操作*/
void enqueue(sqqueue *q, qelemtype e)
else //佇列存滿迴圈覆蓋
}/*資料出隊操作*/
資料結構之佇列
八 佇列 鏈式佇列 鍊錶實現 隊尾 rear 隊首 front 靜態佇列 陣列實現 必須是迴圈佇列 需要幾個引數來確定,各引數含義 1 佇列初始化 front和rear值都是0 2 佇列非空 front代表佇列第乙個元素 rear代表佇列最後乙個元素的 下乙個元素 3 佇列空 front和rear相...
資料結構之佇列
與棧相反,佇列是一種先進先出的線性表,它只允許在表的一端進行,而在另一端刪除元 素。在佇列中,允許插入的一端叫做隊尾,允許刪除的一端則稱為隊頭。1 鏈佇列 佇列的鏈式表示和實現 用鍊錶表示的佇列簡稱為鏈佇列,乙個鏈佇列顯然需要兩個分別指示對頭和隊尾的指標 分別稱為頭指 針和尾指標 才能唯一確定。這裡...
資料結構之佇列
一 佇列的介紹 佇列 queue 是一種線性儲存結構。它有以下幾個特點 1 佇列中資料是按照 先進先出 fifo,first in first out 方式進出佇列的。2 佇列只允許在 隊首 進行刪除操作,而在 隊尾 進行插入操作。佇列通常包括的兩種操作 入佇列 和 出佇列。1.佇列的示意圖 佇列中...