佇列是一種先進先出的資料結構,也是常見的資料結構之一。日常生活中的排隊買東西就是一種典型的佇列,而在購票系統也需要乙個佇列處理使用者的購票請求,當然這裡的佇列就複雜多了。本文介紹佇列的基本概念和實現。
佇列最常見的操作是入隊和出隊,拿排隊買東西來說,入隊就是新來乙個人排在隊伍後面,而出隊就是乙個人已經結賬離開。
與實現棧不同,它需要兩個指標,乙個指向隊頭(front),乙個指向隊尾(rear),這樣才能方便地進行入隊或出隊操作,因此佇列的實現要比棧難一些。在說明如何實現乙個佇列之前,先看實現乙個佇列可能需要注意哪些問題。
假如我們使用陣列按照實現棧的方式來實現佇列。並且佇列中的資料如下:
這個時候從隊頭front處刪除乙個資料,這是很容易的。
但是如果要入隊乙個資料呢?這個時候發現隊尾已經沒有空間了,為了入隊乙個元素,必須將所有元素都往隊頭移動,這似乎很符合我們排隊的習慣,前面乙個人走了,後面的人都往前乙個位置。但是在陣列中,將所有的元素都往隊頭移動的開銷是不容忽略的!
有人可能已經注意到了,原來刪除的地方還有乙個空位呢,不如把新的元素加入到這裡,然後將尾指標rear指向該處即可。沒錯,這就相當於把該陣列當成了乙個迴圈陣列,即可以看成陣列尾部和頭部是連著的。這個時候就變成了下面的情況:
此時,佇列是滿的,rear指向下標0處,而front指向下標1處。如果這個時候刪除這五個元素,就變成下面的情況:
我們發現隊列為空時,rear指向下標0處,而front指向下標1處,與佇列滿時是一樣的,這樣的話,如何區分佇列是空還是滿呢?
很明顯,隊列為空時與佇列滿時元素數量是不一樣的,我們可以通過判斷佇列中元素的數量是否已達上限,來判斷佇列是否為空。
還有一種方法,就是使得佇列滿時,不佔滿整個陣列,而保留乙個空位。這樣的情況下,佇列滿時,兩個指標相隔2:
佇列空時:
兩個指標相隔1。那麼就可以通過指標的間隔來判斷佇列是否為空了。
這裡就說明了佇列實現需要考慮的兩個問題:
當然了,如果你使用鍊錶實現佇列,那麼入隊也完全不需要搬移資料。
佇列的實現有多種方式可以選擇,例如:
因篇幅有限,本文只選擇一種實現進行說明。
本文的**實現採用了靜態陣列實現乙個佇列,並且為了避免資料頻繁搬移,使用了前面介紹的迴圈佇列;為了測試隊滿的情況,將佇列的容量設定成了很小的值,另外,也通過保留乙個空位的方式來解決隊空和隊滿無法區分的問題。
佇列的主要定義或操作解釋如下。
完整可執行**實現如下:
#include #include typedef int elementtype;
/*為測試,將容量值定為較小值5*/
#define max_size 5
/*定義佇列結構*/
typedef struct queueinfo
queueinfo;
#define success 0
#define failure 1
#define false 0
#define true 1
/*判斷佇列是否已滿*/
int queue_is_full(queueinfo *queue)
else
return false;
}/*判斷佇列是否為滿*/
int queue_is_empty(queueinfo *queue)
else
return false;
}/*出隊*/
int queue_delete(queueinfo *queue,elementtype *value)
/*入隊*/
int queue_insert(queueinfo *queue,elementtype value)
int main(void)
編譯:
$ gcc -o arrayqueue arrayqueue.c
執行結果:
insert 5 to 1
insert 4 to 2
insert 3 to 3
insert 2 to 4
queue is full
queue is full
get value from front 1 is 5
get value from front 2 is 4
get value from front 3 is 3
get value from front 4 is 2
queue is empty
queue is empty
與《棧的實現》相比,佇列的陣列實現相對來說稍微複雜一點,因為它需要考慮隊空和對滿的區別,以及考慮資料搬移的效能影響,但是從實現本身來看,**並不複雜。關於佇列的動態陣列和鍊錶實現可自己嘗試。 php如何判斷乙個陣列為空陣列
1.isset功能 判斷變數是否被初始化 說明 它不會判斷變數是否為空,並且可以用來判斷陣列中元素是否被定義過 例如 a a c if isset a echo a 未被初始化 if isset b echo b 未被初始化 if isset a c echo a 已經被初始化 顯示結果為 b 未被...
判斷乙個陣列是否為空陣列
最近在做乙個專案,遇到乙個需要判斷乙個陣列是否為空陣列的問題。一般的,當被測試的陣列是乙個一維陣列的時候,只要簡單的用 bool empty array 就能解決問題。當被測試的陣列為二維陣列時,empty函式返回的是true,這顯然不行。像下段 中,array 是個空陣列。array array ...
如何判斷乙個陣列和物件為空?
陣列一般用陣列的長度可以判斷 arr null arr.length 0如果是物件呢?有如下方法 1.把物件轉化為字串 json.stringify 然後通過判斷長度。let obj let res json.stringify obj console.log res 說明是空物件2.遍歷 let ...