經典演算法題每日演練 第十九題 雙端佇列

2022-02-18 08:18:12 字數 2771 閱讀 6786

話說大學的時候老師說妹子比工作重要~,工作可以再換,妹子這個。。。所以。。。這兩個月也就一直忙著fall in love,嗨,慢慢調整心態吧,

這篇就選乙個簡單的資料結構聊一聊,話說有很多資料結構都在玩組合拳,比如說:塊狀鍊錶,塊狀陣列,當然還有本篇的雙端佇列,是的,它就是

棧和佇列的組合體。

一:概念

我們知道普通佇列是限制級的一端進,另一端出的fifo形式,棧是一端進出的lifo形式,而雙端佇列就沒有這樣的限制級,也就是我們可以在

佇列兩端進行插入或者刪除操作。

二:編碼

1:定義結構體

通常情況下,佇列的內部都是採用陣列來實現,而且帶有兩個指標head和tail來指向陣列的區間段,為了充分利用陣列空間,我們也會用%來實

現邏輯上的迴圈陣列,如下圖。

這裡有乙個注意的細節就是「size欄位「,它是為了方便統計佇列是否為滿或者佇列是否為空。

2:隊尾入隊

剛才也說了,雙端佇列是可以在佇列的兩端進行插入和刪除的,要注意的是我們用head和tail指標的時候,tail指標是指向元素的下乙個位置,

而head指標是指向當前元素,所以我們可以從tail端push資料的時候只要」順時針「下移乙個位置即可。

1

///2

///隊尾入隊

3///

4///

5///

6public

bool

push_tail(t t)

7

3:隊尾出隊

和隊尾入隊一樣,我們只要將tail指標」逆時針「下移乙個位置,當然有乙個細節需要注意,就是tail指標有存在負值的情況,畢竟我們是做」--操作「的,

所以需要tail+maxsize,即:myqueue.tail = (--myqueue.tail + myqueue.maxsize) % myqueue.maxsize;

1

///2

///隊尾出隊

3///

4///

5///

6public

t pop_tail()

7

4:隊首入隊

從head端來說,我們push資料的時候是head指標「逆時針」旋轉,要注意的是同樣要防止負數的產生,並且head指標是指向當前元素。

1

///2

///隊首入隊

3///

4///

5///

6public

bool

push_head(t t)

7

5:隊首出隊

說到這個方法,我想大家應該都懂了雙端佇列的大概流程了,這個方法我也不用贅敘了。

1

///2

///隊首出隊

3///

4///

5///

6public

t pop_head()

7

從上面的四個方法可以看出:

當我們只使用push_tail和pop_tail的話,那它就是棧。

當我們只使用push_tail和pop_head的話,那它就是佇列。

最後是全部**:

view code

1

using

system.net;

2using

system;

3using

system.io;

4using

system.collections.generic;

5using

system.text;

6using

system.drawing;

7using

system.drawing.imaging;89

class

program

1036}37

38///

39///

雙端佇列

40///

41public

class doublequeue4261}

6263 myqueue myqueue = new

myqueue();

6465

///66

///隊尾入隊

67///

68///

69///

70public

bool

push_tail(t t)

7185

86///

87///

隊尾出隊

88///

89///

90///

91public

t pop_tail()

92109

110///

111///

隊首入隊

112///

113///

114///

115public

bool

push_head(t t)

116131

132///

133///

隊首出隊

134///

135///

136///

137public

t pop_head()

138156 }

經典演算法題每日演練 第十二題 線段樹

這一篇我們來看樹狀陣列的加強版線段樹,樹狀陣列能玩的線段樹一樣可以玩,而且能玩的更好,他們在區間求和,最大,平均 等經典的rmq問題上有著對數時間的優越表現。一 線段樹 線段樹又稱 區間樹 在每個節點上儲存乙個區間,當然區間的劃分採用折半的思想,葉子節點只儲存乙個值,也叫單元節點,所 以最終的構造就...

程式設計第十九題 手機短號

大家都知道,手機號是乙個11位長的數字串,同時,作為學生,還可以申 入校園網,如果加入成功,你將另外擁有乙個短號。假設所有的短號都是是 6 手機號的後5位,比如號碼為13512345678的手機,對應的短號就是645678。現在,如果給你乙個11位長的手機號碼,你能找出對應的短號嗎?輸入資料的第一行...

經典演算法題每日演練 第七題 KMP演算法

在大學的時候,應該在資料結構裡面都看過kmp演算法吧,不知道有多少老師對該演算法是一筆帶過的,至少我們以前是的,確實kmp演算法還是有點饒人的,如果說紅黑樹是 級的,那麼kmp演算法比紅黑樹還要 很抱歉,每次打kmp的時候,輸 入法總是提示 看毛片 三個字,嘿嘿,就叫 看毛片演算法 吧。一 bf演算...