01 故事起源
隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu)。
?
一般通過數(shù)組實現(xiàn)。
?
還需要定義2個指針,頭指針和尾指針。
?
02 插入和刪除
2.1 插入
從隊尾tail處插入,再將tail指針后移。
2.2 刪除
從隊首head處取出元素,再將head指針后移。
?
但數(shù)組是定長的,如果多次插入刪除,tail指針就會超出數(shù)組范圍,而前面其實還是有空間的,所以常用的還是循環(huán)隊列。
?
03 循環(huán)隊列
循環(huán)其實就是讓head,tail兩個指針在數(shù)組內(nèi)循環(huán)移動,當移動到隊尾時就跳到隊首。
?
通過取模就可以實現(xiàn)循環(huán)。
?
當head==tail時,即為隊空。
?
當head==(tail+1)%n時,即為隊滿。如果隊列長度為n,則只能裝n-1個元素,最后一個元素要空著。因為如果放入元素,tail會和head重合,就無法判斷是隊空還是隊滿。
? ?
04 雙端隊列
普通隊列只能隊首出,隊尾進,但有時我們需要隊首和隊尾都能進出,即雙端隊列。
4.1 插入
隊首插入,則head指針前移;隊尾插入,則tail指針后移。
4.2 刪除
隊首刪除,則head指針后移;隊尾刪除,則tail指針前移。
?
05 代碼實現(xiàn)
實現(xiàn)一個模板,以后可重復利用。
先定義必要的方法和變量。
構(gòu)造函數(shù)
插入
刪除
size方法
使用案例
06 總結(jié)
隊列是非常基礎(chǔ)且重要的數(shù)據(jù)結(jié)構(gòu),雙端隊列屬于隊列的升級。很多的算法都是基于隊列來實現(xiàn),例如搜索中的bfs,圖論中的spfa,計算幾何中的melkman等。隊列結(jié)構(gòu)本身很簡單,如何使用才是比較難的,一定要深刻理解,以后才能熟練應(yīng)用到不同的模型中。
審核編輯:劉清
-
BFS
+關(guān)注
關(guān)注
0文章
9瀏覽量
2171
原文標題:如何實現(xiàn)一個雙端隊列?
文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論