摘自:https://www.jianshu.com/p/1f1520db325d
雙端隊列是與隊列類似的項的有序集合。
雙端隊列有兩個端部,首部和尾部,並且項在集合中保持不變。
雙端隊不同的地方是添加和刪除項是非限制性的。可以在前面或后面添加新項;同樣,可以從任一端移除現有項。

雙端隊列抽象數據類型
如上所述,deque 被構造為項的有序集合,其中項從首部或尾部的任一端添加和移除。
下面給出了 deque 操作。
操作 | 描述 | 返回值 |
---|---|---|
Deque() | 創建一個空的新 deque,不需要參數 | 返回空的 deque |
addFront(item) | 將一個新項添加到 deque 的首部,需要 item 參數 | 不返回任何內容 |
addRear(item) | 將一個新項添加到 deque 的尾部,需要 item 參數 | 不返回任何內容 |
removeFront() | 從 deque 中刪除首項,deque 被修改 | 返回刪除項 item |
removeRear() | 從 deque 中刪除尾項,deque 被修改 | 返回刪除項 item |
isEmpty() | 測試 deque 是否為空,不需要參數 | 返回布爾值 |
size() | 返回 deque 中的項數,它不需要參數 | 返回一個整數 |
python實現雙端隊列
class Deque(object): 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) if __name__ == '__main__': deq = Deque()
雙端隊列的應用
使用 deque 數據結構可以容易地解決經典回文問題。回文是一個字符串,讀取首尾相同的字符,例如,radar toot madam
。 我們想構造一個算法輸入一個字符串,並檢查它是否是一個回文。
解決方案:
- 將字符串添加到雙端隊列中
-
直接刪除並比較收尾字符串,如果可以持續匹配首尾字符,我們最終要么用完字符,要么留出大小為 1 的deque,取決於原始字符串的長度是偶數還是奇數。
回文檢查:#回文檢查 def palchecker(aString): #創建一個雙端隊列,將字符串中的字符依次添加到雙端隊列中 charqueue = Deque() for char in aString: charqueue.addRear(char) stillEqual = True #當至少有一個字符並且滿足收尾相等則循環 while charqueue.size() > 1 and stillEqual: first = charqueue.removeFront() last = charqueue.removeRear() if first != last: stillEqual = False return stillEqual print(palchecker("lsdkjfskf")) print(palchecker("radar"))