資料結構 佇列

2021-10-07 22:16:36 字數 3372 閱讀 9656

在fifo資料結構中,將首先處理新增到佇列中的第乙個元素。插入(insert)操作稱為入隊(enqueue),新元素始終被新增在佇列的末尾。刪除(delete)操作被稱為出隊(dequeue)。你只能移除第乙個元素。

為了實現佇列,我們可以使用動態陣列和指向佇列頭部的索引。

如上所述,佇列應支援兩種操作:入隊和出隊。入隊會向佇列追加乙個新元素,而出隊會刪除第乙個元素。 所以我們需要乙個索引來指出起點

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...