雙端隊列


摘自: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. 將字符串添加到雙端隊列中
  2. 直接刪除並比較收尾字符串,如果可以持續匹配首尾字符,我們最終要么用完字符,要么留出大小為 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"))

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM