01 故事起源
隊列是一種先進先出的數據結構。 ?
一般通過數組實現。
?
還需要定義2個指針,頭指針和尾指針。 ?
02 插入和刪除
2.1 插入
從隊尾tail處插入,再將tail指針后移。
2.2 刪除
從隊首head處取出元素,再將head指針后移。 ?
但數組是定長的,如果多次插入刪除,tail指針就會超出數組范圍,而前面其實還是有空間的,所以常用的還是循環隊列。 ?
03 循環隊列
循環其實就是讓head,tail兩個指針在數組內循環移動,當移動到隊尾時就跳到隊首。 ?
通過取模就可以實現循環。 ?
當head==tail時,即為隊空。
?
當head==(tail+1)%n時,即為隊滿。如果隊列長度為n,則只能裝n-1個元素,最后一個元素要空著。因為如果放入元素,tail會和head重合,就無法判斷是隊空還是隊滿。
? ?
04 雙端隊列
普通隊列只能隊首出,隊尾進,但有時我們需要隊首和隊尾都能進出,即雙端隊列。
4.1 插入
隊首插入,則head指針前移;隊尾插入,則tail指針后移。
4.2 刪除
隊首刪除,則head指針后移;隊尾刪除,則tail指針前移。
?
05 代碼實現
實現一個模板,以后可重復利用。
先定義必要的方法和變量。
構造函數
![pYYBAGNaWgaAe_rcAAA7pt2b8w8036.jpg](https://file.elecfans.com/web2/M00/74/9F/pYYBAGNaWgaAe_rcAAA7pt2b8w8036.jpg)
插入
![pYYBAGNaWhqAMxtzAACZlor3Pqg744.jpg](https://file.elecfans.com/web2/M00/74/9F/pYYBAGNaWhqAMxtzAACZlor3Pqg744.jpg)
刪除
![pYYBAGNaWjWAIjFIAACbiK6QEao611.jpg](https://file.elecfans.com/web2/M00/74/9F/pYYBAGNaWjWAIjFIAACbiK6QEao611.jpg)
size方法
![poYBAGNaWkiAZQ7kAAA6IiPLzO0989.jpg](https://file.elecfans.com/web2/M00/74/0C/poYBAGNaWkiAZQ7kAAA6IiPLzO0989.jpg)
使用案例
![poYBAGNaWmiAVn6gAADaowX09qA627.jpg](https://file.elecfans.com/web2/M00/74/0C/poYBAGNaWmiAVn6gAADaowX09qA627.jpg)
06 總結
隊列是非常基礎且重要的數據結構,雙端隊列屬于隊列的升級。很多的算法都是基于隊列來實現,例如搜索中的bfs,圖論中的spfa,計算幾何中的melkman等。隊列結構本身很簡單,如何使用才是比較難的,一定要深刻理解,以后才能熟練應用到不同的模型中。
審核編輯:劉清
-
BFS
+關注
關注
0文章
9瀏覽量
2188
原文標題:如何實現一個雙端隊列?
文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
【設計技巧】rtos的核心原理簡析
Rockchip RK3399 Linux4.4 USB DTS配置步驟簡析
簡析BGA封裝技術與質量控制
簡析用電阻設定增益的單端至差分轉換器資料下載
![<b class='flag-5'>簡</b><b class='flag-5'>析</b>用電阻設定增益的單<b class='flag-5'>端</b>至差分轉換器資料下載](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
TencentOS-tiny中環形隊列的實現
巖土工程監測中振弦采集儀的布設方案及實施步驟簡析
![巖土工程監測中振弦采集儀的布設方案及實施<b class='flag-5'>步驟</b><b class='flag-5'>簡</b><b class='flag-5'>析</b>](https://file1.elecfans.com/web2/M00/8D/D4/wKgZomTAsDGAZv56AACDQIjQq_g000.png)
評論