網(wǎng)站首頁 編程語言 正文
什么是雙端隊(duì)列?
雙端隊(duì)列是與隊(duì)列類似的有序集合。它有一前、一后兩端,元素在其中保持自己的位置。與隊(duì)列不同的是,雙端隊(duì)列對(duì)在哪一端添加和移除元素沒有任何限制。新元素既可以被添加到前端,也可以被添加到后端。同理,已有的元素也能從任意一端移除。某種意義上,雙端隊(duì)列可以是棧和隊(duì)列的結(jié)合。
值得注意的是,盡管雙端隊(duì)列有棧和隊(duì)列的很多特性,但是它并不要求按照這兩種數(shù)據(jù)結(jié)構(gòu)分別規(guī)定的LIFO原則和FIFO原則操作元素。具體的排序原則取決于其使用者。
?雙端隊(duì)列抽象數(shù)據(jù)類型由下面的結(jié)構(gòu)和操作定義。如前所述,雙端隊(duì)列是元素的有序集合,其任何一端都允許添加或移除元素。雙端隊(duì)列支持以下操作:?
- 創(chuàng)建一個(gè)空的雙端隊(duì)列。它不需要參數(shù),且會(huì)返回一個(gè)空的雙端隊(duì)列。 Deque()
- 將一個(gè)元素添加到雙端隊(duì)列的前端。它接受一個(gè)元素作為參數(shù),沒有返回值。 addFront(item)
- 將一個(gè)元素添加到雙端隊(duì)列的后端。它接受一個(gè)元素作為參數(shù),沒有返回值。 addRear(item)
- 從雙端隊(duì)列的前端移除一個(gè)元素。它不需要參數(shù),且會(huì)返回一個(gè)元素,并修改雙端隊(duì)列的內(nèi)容。 removeFront()
- 從雙端隊(duì)列的后端移除一個(gè)元素。它不需要參數(shù),且會(huì)返回一個(gè)元素, 并修改雙端隊(duì)列的內(nèi)容。 removeRear()
- 檢查雙端隊(duì)列是否為空。它不需要參數(shù),且會(huì)返回一個(gè)布爾值。 isEmpty()
- 返回雙端隊(duì)列中元素的數(shù)目。它不需要參數(shù),且會(huì)返回一個(gè)整數(shù)。 size()
?用Python實(shí)現(xiàn)雙端隊(duì)列
我們通過創(chuàng)建一個(gè)新類來實(shí)現(xiàn)雙端隊(duì)列抽象數(shù)據(jù)類型。Python列表再一次提供了 很多簡便的方法來幫助我們構(gòu)建雙端隊(duì)列。在下面的代碼中,我們假設(shè)雙端隊(duì)列的后端是列表的位置0處(列表的最左端)。
class Deque: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] # 往雙端隊(duì)列前端添加元素 def addFront(self, item): self.items.append(item) # 往雙端隊(duì)列后端添加元素 def addRear(self, item): self.items.insert(0, item) # 在前端移除雙端隊(duì)列元素 def removeFront(self): return self.items.pop() # 在后端移除雙端隊(duì)列元素 def removeRear(self): return self.items.pop(0) def size(self): return len(self.items) def look(self): print(self.items)
removeFront 使用?pop?方法移除列表中的最后一個(gè)元素,removeRear 則使用?pop(0)?方法移除列表中的第一個(gè)元素。同理,之所以 addRear 使用?insert?方法,是因?yàn)?append?方法只能在列表的最后(最右端)添加元素。?
代碼運(yùn)行效果如下:
運(yùn)用雙端隊(duì)列構(gòu)建回文檢測(cè)器
我們現(xiàn)在運(yùn)用雙端隊(duì)列解決一個(gè)非常有趣的經(jīng)典問題:回文問題。回文是指從前往后讀和從后往前讀都一樣的字符串,例如 sos、radar、toot、madam 等等。我們將構(gòu)建一個(gè)程序,它接受一個(gè)字符串并且檢測(cè)其是否為回文。?
該問題的解決方案是使用一個(gè)雙端隊(duì)列來存儲(chǔ)字符串中的字符。按照從左往右的順序?qū)⒆址械淖址砑拥诫p端隊(duì)列的后端或前端。此時(shí),該雙端隊(duì)列類似于一個(gè)普通的隊(duì)列。?
由于可以從前后兩端移除元素,因此我們能夠比較兩個(gè)元素,并且只有在二者相等時(shí)才繼續(xù)。如果一直匹配第一個(gè)和最后一個(gè)元素,最終會(huì)處理完所有的字符(如果字符數(shù)是偶數(shù)),或者剩下只有一個(gè)元素的雙端隊(duì)列(如果字符數(shù)是奇數(shù))。任意一種結(jié)果都表明輸入字符串是回文。?
回文檢測(cè)器代碼如下:
class Deque: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def addFront(self, item): self.items.append(item) def addRear(self, item): self.items.insert(0, item) def removeFront(self): return self.items.pop() def removeRear(self): return self.items.pop(0) def size(self): return len(self.items) def palchecker(aString): chardeque = Deque() for ch in aString: chardeque.addFront(ch) stillEqual = True while chardeque.size() > 1 and stillEqual: first = chardeque.removeFront() last = chardeque.removeRear() if first != last: stillEqual = False return stillEqual
總結(jié)
原文鏈接:https://blog.csdn.net/jiang1126/article/details/123337898
相關(guān)推薦
- 2022-12-12 flutter自定義InheritedProvider實(shí)現(xiàn)狀態(tài)管理詳解_Android
- 2022-05-09 C++智能指針shared_ptr_C 語言
- 2023-12-14 excel統(tǒng)計(jì)某個(gè)字符出現(xiàn)的次數(shù),判斷某單元格的數(shù)據(jù)是否在另外一列
- 2023-01-17 python?PyQt5(自定義)信號(hào)與槽使用及說明_python
- 2022-06-01 c++?深入理解歸并排序的用法_C 語言
- 2023-10-31 springboot 線程池參數(shù)解釋
- 2023-05-29 linux?rename?批量修改文件名的操作方法_linux shell
- 2023-03-19 Android全面屏適配與判斷超詳細(xì)講解_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支