小白演算法積累 佇列4 無限膨脹儲存空間

2021-10-03 09:57:09 字數 1224 閱讀 2060

題目:請設計乙個佇列,要求滿足:

1、初始時隊列為空;

2、入隊時,允許增加佇列占用空間;

3、出隊後,出隊元素所占用的空間可重複使用,即整個佇列所占用的空間只增不減;

4、入隊操作和出隊操作的時間複雜度始終保持o(1)。

請回答下列問題:

1)該佇列是應該選擇鏈式儲存結構,還是應選擇順序儲存結構?

2)畫出佇列的初始狀態,並給出判斷隊空和隊滿的條件

3)畫出第乙個元素入隊後的佇列狀態。

4)給出入隊操作和出隊操作的基本過程。

關鍵字:佇列+無限膨脹儲存空間

思路

1)順序儲存無法滿足要求2的佇列占用空間隨著入隊操作而增加。

根據要求來分析:

要求1容易滿足;鏈式儲存方便開闢新空間

要求2容易滿足;

要求3:出隊後的結點並不真正釋放,用隊頭指標指向新的隊頭結點,

新元素入隊時,有空餘結點則無須開闢新空間,賦值到隊尾後的第乙個空結點即可,然後用隊尾指標指向新的隊尾結點

這就需要設計成乙個首尾相接的迴圈單鏈表,類似於迴圈佇列的思想。

設定隊頭、隊尾指標後,鏈式佇列的入隊操作和出隊操作的時間複雜度均為o(1),滿足要求4

因此,採用鏈式儲存結構(兩段式單向迴圈鍊錶),隊頭指標為front,隊尾指標為rear

2)該迴圈鏈式佇列的實現可以參考迴圈佇列,不同之處在於迴圈鏈式佇列可以方便地增加空間,出隊的結點可以迴圈利用,入隊時空間不夠也可以動態增加。

同樣,迴圈鏈式佇列也要區分隊滿和隊空的情況,這裡參考迴圈佇列犧牲乙個單元來判斷。初始時,建立只有乙個空閒結點的迴圈單鏈表,頭指標front和尾指標rear均指向空閒結點,

隊空的判定條件:front==rear

隊滿的判定條件:front == rear->next

3)略4)操作的基本過程如下:

入隊操作:

若(front == rear->next)//隊滿

則在rear後面插入乙個新的空閒結點;

入隊元素儲存到rear所指結點中;

rear=rear->next;返回

出隊操作:

若(front== rear)//隊空

則出隊失敗,返回;

取front所指結點中的元素e;front=front->next;返回e

小白演算法積累 佇列1 迴圈佇列 tag

題目 若希望迴圈佇列中的元素都能得到利用,則需設定乙個標誌域tag,並以tag的值為0或1來區分隊頭指標front和隊尾指標rear相同時的佇列狀態是 空 還是 滿 試編寫與此結構相應的入隊和出隊演算法。關鍵字 迴圈佇列 tag的使用 思路 迴圈佇列 需要變數 隊頭指標front,隊尾指標rear,...

小白演算法積累 棧1 判斷合法操作序列

題目 i 入棧,o 出棧。寫出乙個演算法,判定所給的操作序列是否合法。合法要求 棧的初態和終態均為空。若合法,返回true,否則返回false 假定被判定的操作序列已存入一維陣列中 關鍵字 判斷入棧出棧操作序列是否合法 思路 入棧 無論多少次,只要記憶體足夠,就可以進行 限制 記憶體足夠 出棧 必須...

排序演算法積累 4 歸併排序

一 歸併排序思路 大體思路就是將資料在中位數的位置分成兩個區間,一直重複,直到最後節點只有乙個數 二 程式 include include include 用setprecision n 設定精度,其中n表示精確到小數點後n位 using namespace std void merge int a...