資料結構之佇列詳解

2021-09-18 05:11:30 字數 3557 閱讀 7002

目錄

佇列queue

佇列的實現

佇列的時間複雜度

迴圈佇列的時間複雜度

介面queue:

/**

* created by binzhang on 2019/3/17.

*/public inte***ce queue

實現類arrayqueue:

/**

* created by binzhang on 2019/3/17.

*/public class arrayqueueimplements queue

public arrayqueue()

@override

public int getsize()

@override

public boolean isempty()

public int getcapacity()

@override

public void enqueue(e e)

@override

public e dequeue()

@override

public e getfront()

@override

public string tostring()

return res.tostring();

}public static void main(string args) }}

}

main方法執行結果:

queue: [0] tail

queue: [0, 1] tail

queue: [0, 1, 2] tail

queue: [1, 2] tail

queue: [1, 2, 3] tail

queue: [1, 2, 3, 4] tail

queue: [1, 2, 3, 4, 5] tail

queue: [2, 3, 4, 5] tail

queue: [2, 3, 4, 5, 6] tail

queue: [2, 3, 4, 5, 6, 7] tail

queue: [2, 3, 4, 5, 6, 7, 8] tail

queue: [3, 4, 5, 6, 7, 8] tail

queue: [3, 4, 5, 6, 7, 8, 9] tail

arrayqueue

可以看到陣列出列的時間複雜度是o(n)的,所有的元素都要向前挪一位,效能相對是比較低的。

迴圈佇列可以解決這個問題。

迴圈佇列加入了front和tail兩個屬性。

當front==tail時隊列為空。

每次入隊的時候tail都會向後移動乙個單位,當有出隊操作時,front也會向後移動乙個單位。

當資料插入到位置7後,tail會回到0位置。

那麼tail是怎麼回到0的呢,當我們插入的元素大於佇列長度時採用取餘的方式來計算

tail = (i + 1)/capacity

這裡就是(7+1)/8(8為陣列長度)就回到了我們索引為0的位置

注意我們之前定義了front==tail是隊列為空的標誌,索引當遇到下圖情況即tail+1==front(更準確的說是(tail + 1) % c == front)的時候就表明我們的佇列是滿的了,可以進行擴容了,也就是說迴圈佇列中總會是浪費乙個空間的。

手寫乙個迴圈佇列:

/**

* created by binzhang on 2019/3/17.

*/public class loopqueueimplements queue

public loopqueue()

public int getcapacity()

@override

public int getsize()

@override

public boolean isempty()

@override

public void enqueue(e e)

private void resize(int newcapacity)

@override

public e dequeue()

@override

public e getfront()

@override

public string tostring()

return res.tostring();

}public static void main(string args) }}

}

輸出:

queue: size = 1, capacity = 10

front [0] tail

queue: size = 2, capacity = 10

front [0, 1] tail

queue: size = 3, capacity = 10

front [0, 1, 2] tail

queue: size = 2, capacity = 5

front [1, 2] tail

queue: size = 3, capacity = 5

front [1, 2, 3] tail

queue: size = 4, capacity = 5

front [1, 2, 3, 4] tail

queue: size = 5, capacity = 5

front [1, 2, 3, 4, 5] tail

queue: size = 4, capacity = 5

front [2, 3, 4, 5] tail

queue: size = 5, capacity = 5

front [2, 3, 4, 5, 6] tail

queue: size = 6, capacity = 10

front [2, 3, 4, 5, 6, 7] tail

queue: size = 7, capacity = 10

front [2, 3, 4, 5, 6, 7, 8] tail

queue: size = 6, capacity = 10

front [3, 4, 5, 6, 7, 8] tail

queue: size = 7, capacity = 10

front [3, 4, 5, 6, 7, 8, 9] tail

迴圈佇列出列的時間複雜度變為o(1)

loopqueue

資料結構之佇列詳解

介面queue created by binzhang on 2019 3 17.public inte ce queue 實現類arrayqueue created by binzhang on 2019 3 17.public class arrayqueue implements queue ...

資料結構之迴圈佇列詳解

佇列是一種運算受限的線性表。所謂的運算受限主要是指插入操作限定在表的某一端 隊尾 進行,刪除操作限定在表的另一端 對頭 進行。佇列通常也被稱為先進先出 fifo 的線性表。佇列通常有兩種儲存結構,即順序儲存結構和鏈式儲存結構。順序儲存結構的佇列通常稱為順序佇列。注意 queue max size表示...

資料結構之佇列

八 佇列 鏈式佇列 鍊錶實現 隊尾 rear 隊首 front 靜態佇列 陣列實現 必須是迴圈佇列 需要幾個引數來確定,各引數含義 1 佇列初始化 front和rear值都是0 2 佇列非空 front代表佇列第乙個元素 rear代表佇列最後乙個元素的 下乙個元素 3 佇列空 front和rear相...