網站首頁 編程語言 正文
什么是雙端隊列?
雙端隊列是與隊列類似的有序集合。它有一前、一后兩端,元素在其中保持自己的位置。與隊列不同的是,雙端隊列對在哪一端添加和移除元素沒有任何限制。新元素既可以被添加到前端,也可以被添加到后端。同理,已有的元素也能從任意一端移除。某種意義上,雙端隊列可以是棧和隊列的結合。
值得注意的是,盡管雙端隊列有棧和隊列的很多特性,但是它并不要求按照這兩種數據結構分別規定的LIFO原則和FIFO原則操作元素。具體的排序原則取決于其使用者。
?雙端隊列抽象數據類型由下面的結構和操作定義。如前所述,雙端隊列是元素的有序集合,其任何一端都允許添加或移除元素。雙端隊列支持以下操作:?
- 創建一個空的雙端隊列。它不需要參數,且會返回一個空的雙端隊列。 Deque()
- 將一個元素添加到雙端隊列的前端。它接受一個元素作為參數,沒有返回值。 addFront(item)
- 將一個元素添加到雙端隊列的后端。它接受一個元素作為參數,沒有返回值。 addRear(item)
- 從雙端隊列的前端移除一個元素。它不需要參數,且會返回一個元素,并修改雙端隊列的內容。 removeFront()
- 從雙端隊列的后端移除一個元素。它不需要參數,且會返回一個元素, 并修改雙端隊列的內容。 removeRear()
- 檢查雙端隊列是否為空。它不需要參數,且會返回一個布爾值。 isEmpty()
- 返回雙端隊列中元素的數目。它不需要參數,且會返回一個整數。 size()
?用Python實現雙端隊列
我們通過創建一個新類來實現雙端隊列抽象數據類型。Python列表再一次提供了 很多簡便的方法來幫助我們構建雙端隊列。在下面的代碼中,我們假設雙端隊列的后端是列表的位置0處(列表的最左端)。
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 look(self): print(self.items)
removeFront 使用?pop?方法移除列表中的最后一個元素,removeRear 則使用?pop(0)?方法移除列表中的第一個元素。同理,之所以 addRear 使用?insert?方法,是因為?append?方法只能在列表的最后(最右端)添加元素。?
代碼運行效果如下:
運用雙端隊列構建回文檢測器
我們現在運用雙端隊列解決一個非常有趣的經典問題:回文問題。回文是指從前往后讀和從后往前讀都一樣的字符串,例如 sos、radar、toot、madam 等等。我們將構建一個程序,它接受一個字符串并且檢測其是否為回文。?
該問題的解決方案是使用一個雙端隊列來存儲字符串中的字符。按照從左往右的順序將字符串中的字符添加到雙端隊列的后端或前端。此時,該雙端隊列類似于一個普通的隊列。?
由于可以從前后兩端移除元素,因此我們能夠比較兩個元素,并且只有在二者相等時才繼續。如果一直匹配第一個和最后一個元素,最終會處理完所有的字符(如果字符數是偶數),或者剩下只有一個元素的雙端隊列(如果字符數是奇數)。任意一種結果都表明輸入字符串是回文。?
回文檢測器代碼如下:
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
總結
原文鏈接:https://blog.csdn.net/jiang1126/article/details/123337898
相關推薦
- 2022-03-26 C++中靜態數據成員使用示例_C 語言
- 2022-11-18 Python學習之字符串常用操作詳解_python
- 2022-05-24 C#中Dispose和Finalize方法使用介紹_C#教程
- 2021-11-28 jQuery實現全部購物車功能實例_jquery
- 2022-03-28 Python獲取網絡時間戳的兩種方法詳解_python
- 2022-05-25 @NoArgsConstructor、@AllArgsConstructor、@RequiredAr
- 2022-11-13 python學習之whl文件解釋與安裝詳解_python
- 2022-08-27 前端變量函數命名規則總結_基礎知識
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支