判斷乙個陣列為空 如何自己實現乙個佇列

2021-10-16 06:32:13 字數 2832 閱讀 6252

佇列是一種先進先出的資料結構,也是常見的資料結構之一。日常生活中的排隊買東西就是一種典型的佇列,而在購票系統也需要乙個佇列處理使用者的購票請求,當然這裡的佇列就複雜多了。本文介紹佇列的基本概念和實現。

佇列最常見的操作是入隊和出隊,拿排隊買東西來說,入隊就是新來乙個人排在隊伍後面,而出隊就是乙個人已經結賬離開。

與實現棧不同,它需要兩個指標,乙個指向隊頭(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 ...