python資料結構_雙端佇列
阿新 • • 發佈:2020-07-27
雙端佇列
雙端佇列(deque,全名double-ended queue),是一種具有佇列和棧的性質的資料結構。
雙端佇列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。雙端佇列可以在佇列任意一端入隊和出隊。
操作
- Deque() 建立一個空的雙端佇列
- add_front(item) 從隊頭加入一個item元素
- add_rear(item) 從隊尾加入一個item元素
- remove_front() 從隊頭刪除一個item元素
- remove_rear() 從隊尾刪除一個item元素
- is_empty() 判斷雙端佇列是否為空
- size() 返回佇列的大小
實現
class Deque(object): """雙端佇列""" def __init__(self): self.items = [] def is_empty(self): """判斷佇列是否為空""" return self.items == [] def add_front(self, item): """在隊頭新增元素""" self.items.insert(0,item) def add_rear(self, item): """在隊尾新增元素""" self.items.append(item) def remove_front(self): """從隊頭刪除元素""" return self.items.pop(0) def remove_rear(self): """從隊尾刪除元素""" return self.items.pop() def size(self): """返回佇列大小""" return len(self.items) if __name__ == "__main__": deque = Deque() deque.add_front(1) deque.add_front(2) deque.add_rear(3) deque.add_rear(4) print(deque.size()) print(deque.remove_front()) print(deque.remove_front()) print(deque.remove_rear()) print(deque.remove_rear())
""" 一個能用雙端佇列資料結構輕鬆解決的問題是經典的“迴文詞”問題。 迴文詞指的是正讀和反 讀都一樣的詞,如:radar、toot 和 madam。 我們想要編寫一個演算法來檢查放入的字串是否為迴文詞。 這個問題的解決方案是用一個雙端佇列來儲存這個字串。我們遍歷這個字串並把它的每個字母新增到雙端佇列的尾端。 現在這個雙端佇列看起來非常像一個普通佇列,但我們可以利用雙端 佇列兩端的對稱性。雙端佇列的首端用來儲存第一個字元,尾端用來儲存最後一個字元。 因為我們能夠同時取出兩端的字元,所以我們可以比較它們是否相同,如果相同就繼續比較剩 下的雙端佇列的首尾字元。 如果我們持續比較首尾字元並發現它們相同,最後字串要麼被比較 完,要麼只剩下一個字元,這取決於字串的原始長度是奇數還是偶數。 不管哪種情況,這個字串都是一個迴文詞。迴文詞判斷函式的實現如下。 """ from deque import Deque def palchecker(aString): chardeque = Deque() for ch in aString: chardeque.addRear(ch) stillEqual = True while chardeque.size() > 1 and stillEqual: first = chardeque.removeFront() last = chardeque.removeRear() if first != last: stillEqual = False return stillEqual print(palchecker('yhgughy'))