為了實現佇列,我們可以使用動態陣列和指向佇列頭部的索引。
如上所述,佇列應支援兩種操作:入隊和出隊。入隊會向佇列追加乙個新元素,而出隊會刪除第乙個元素。 所以我們需要乙個索引來指出起點
class
myqueue
/** 向佇列中插入乙個元素,如果操作成功則返回true*/
public
boolean
enqueue
(int x)
;/** 向佇列中刪除乙個元素,如果操作成功則返回true*/
public
boolean
dequeue()
p_start++
;return
true;}
/** 從佇列中獲取前端項. */
public
intfront()
/** 檢查佇列是否為空. */
public
boolean
isempty()
};public
class
main
q.dequeue()
;if(q.isempty()
==false
) q.
dequeue()
;if(q.isempty()
==false)}
}
佇列元素的入列就是在隊尾追加乙個元素,不需要移動任何元素,因此時間複雜度為o(1)
佇列元素的出列是在隊頭,即下標為0的位置,那就意味著,佇列中的所有元素都得向前移動,以保證佇列裡的隊頭(也就是下標為0的位置)不為空,此時的時間複雜度為o(n)。
如果不去限制佇列的元素必須儲存在陣列的前n個單元這一條件,出隊的效能就會大大增加。也就是說,隊頭不需要一定在下標為0的位置。
為了避免當只有乙個元素時,隊頭和隊尾重合使處理變得麻煩,所以可引入兩個指標,front指標指向隊頭元素,rear指標指向隊尾元素的下乙個位置,這樣當front等於rear時,此佇列不是還剩乙個元素,而是空佇列。
假設乙個長度為5的陣列,初始狀態,空佇列如下左圖所示,front與rear指標均指向下標為0的位置。然**隊a1,a2,a3,a4,front指標依然指向下標為0的位置,rear指標指向下標為4的位置。
出隊a1,a2,則front指標指向下標為2的位置,rear不變。然後在入隊a5,此時front指標不變,rear指標會移動到陣列之外,這種現象叫作假溢位。
假設乙個佇列的總個數不超過5個,但目前如果接著入隊的話,因陣列末尾元素已經被占用,再向後加,就會產生陣列越界的錯誤,可實際上我們的佇列在下標為0和1的地方還是空閒的解決假溢位的辦法就是後面滿了,就再從頭開始,也就是頭尾相接迴圈。佇列的這種頭尾相接的順序儲存結構稱為迴圈佇列。
如果出現陣列越界,rear指標改為指向下標為0的位置,繼續儲存資料
接著在入隊a6,將其放置於下標為0處,rear指標指向下標為1處。若在入隊a7,則rear指標就與front指標重合,同時指向下標為2的位置。但是該種方式無法判斷佇列究竟是空的還是滿的,因為front等於rear時,佇列既可是空佇列也可是滿佇列。
讓我們來繼續優化
當隊列為空時,條件就是front = rear,當隊列為滿時,我們修改其條件,保留乙個元素空間。也就是說佇列滿時,陣列中還有乙個空閒單元。
此時判斷佇列是否滿的條件是:(rear+1)%queuesize == front
queuesize:表示佇列的最大尺寸class
mycircularqueue
/** 向迴圈佇列插入乙個元素。如果成功插入則返回真 */
public
boolean
enqueue
(int value)if(
isempty()
==true
) tail =
(tail +1)
% size;
data[tail]
= value;
return
true;}
/** 從迴圈佇列中刪除乙個元素。如果成功刪除則返回真 */
public
boolean
dequeue()
if(head == tail)
head =
(head +1)
% size;
return
true;}
/** 從隊首獲取元素。如果隊列為空,返回 -1 */
public
intfront()
return data[head];}
/** 獲取隊尾元素。如果隊列為空,返回 -1 */
public
intrear()
return data[tail];}
/** 檢查迴圈佇列是否為空. */
public
boolean
isempty()
/** 檢查迴圈佇列是否已滿 */
public
boolean
isfull()
}
資料結構 佇列
一 佇列的迴圈陣列實現。1 初始化 空佇列。令rear front 0。2 入佇列 約定rear指向佇列尾元素的下乙個位置。入佇列時,先判斷佇列是否已滿,而後將array rear x 然後rear 3 出佇列 約定front指向佇列的首元素位置。出佇列時,先判斷佇列是否為空,而後返回隊首元素re ...
資料結構 佇列
資料參考自 資料結構c 語言描述 佇列是一種先進先出的資料結構,這與棧正好相反。下例是簡單的queue實現 queue.h檔案 ifndef queue h define queue h include include 資料元素結構 自定義 struct datatype 佇列元素最大數 const...
資料結構 佇列
code for fun created by dream whui 2015 1 25 include stdafx.h include include using namespace std define true 1 define false 0 define ok 1 define erro...