01 故事起源
隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)。 ?
一般通過(guò)數(shù)組實(shí)現(xiàn)。
?
還需要定義2個(gè)指針,頭指針和尾指針。 ?
02 插入和刪除
2.1 插入
從隊(duì)尾tail處插入,再將tail指針后移。
2.2 刪除
從隊(duì)首head處取出元素,再將head指針后移。 ?
但數(shù)組是定長(zhǎng)的,如果多次插入刪除,tail指針就會(huì)超出數(shù)組范圍,而前面其實(shí)還是有空間的,所以常用的還是循環(huán)隊(duì)列。 ?
03 循環(huán)隊(duì)列
循環(huán)其實(shí)就是讓head,tail兩個(gè)指針在數(shù)組內(nèi)循環(huán)移動(dòng),當(dāng)移動(dòng)到隊(duì)尾時(shí)就跳到隊(duì)首。 ?
通過(guò)取模就可以實(shí)現(xiàn)循環(huán)。 ?
當(dāng)head==tail時(shí),即為隊(duì)空。
?
當(dāng)head==(tail+1)%n時(shí),即為隊(duì)滿。如果隊(duì)列長(zhǎng)度為n,則只能裝n-1個(gè)元素,最后一個(gè)元素要空著。因?yàn)槿绻湃朐兀瑃ail會(huì)和head重合,就無(wú)法判斷是隊(duì)空還是隊(duì)滿。
? ?
04 雙端隊(duì)列
普通隊(duì)列只能隊(duì)首出,隊(duì)尾進(jìn),但有時(shí)我們需要隊(duì)首和隊(duì)尾都能進(jìn)出,即雙端隊(duì)列。
4.1 插入
隊(duì)首插入,則head指針前移;隊(duì)尾插入,則tail指針后移。
4.2 刪除
隊(duì)首刪除,則head指針后移;隊(duì)尾刪除,則tail指針前移。
?
05 代碼實(shí)現(xiàn)
實(shí)現(xiàn)一個(gè)模板,以后可重復(fù)利用。
先定義必要的方法和變量。
構(gòu)造函數(shù)

插入

刪除

size方法

使用案例

06 總結(jié)
隊(duì)列是非常基礎(chǔ)且重要的數(shù)據(jù)結(jié)構(gòu),雙端隊(duì)列屬于隊(duì)列的升級(jí)。很多的算法都是基于隊(duì)列來(lái)實(shí)現(xiàn),例如搜索中的bfs,圖論中的spfa,計(jì)算幾何中的melkman等。隊(duì)列結(jié)構(gòu)本身很簡(jiǎn)單,如何使用才是比較難的,一定要深刻理解,以后才能熟練應(yīng)用到不同的模型中。
審核編輯:劉清
-
BFS
+關(guān)注
關(guān)注
0文章
9瀏覽量
2241
原文標(biāo)題:如何實(shí)現(xiàn)一個(gè)雙端隊(duì)列?
文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
新能源電池產(chǎn)業(yè)鏈及投資機(jī)會(huì)簡(jiǎn)析-磷酸亞鐵鋰
【設(shè)計(jì)技巧】rtos的核心原理簡(jiǎn)析
Rockchip RK3399 Linux4.4 USB DTS配置步驟簡(jiǎn)析
PCB線路板電鍍銅工藝簡(jiǎn)析
EPON技術(shù)簡(jiǎn)析
簡(jiǎn)析BGA封裝技術(shù)與質(zhì)量控制
鼠標(biāo)HID例程(中)簡(jiǎn)析
簡(jiǎn)析用電阻設(shè)定增益的單端至差分轉(zhuǎn)換器資料下載

TencentOS-tiny中環(huán)形隊(duì)列的實(shí)現(xiàn)
利用C++提供的隊(duì)列封裝一個(gè)消息隊(duì)列

雙端隊(duì)列和C++ std::deque的用法說(shuō)明

兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列方法
巖土工程監(jiān)測(cè)中振弦采集儀的布設(shè)方案及實(shí)施步驟簡(jiǎn)析

評(píng)論