03_python_deque

用python實現雙端隊列

  • 採用List實現
    • List下標0作爲雙端隊列的尾端;List下標-1作爲雙端隊列的首端
    • addFront()/removeFront()函數操作複雜度爲:O(1)
    • addRear()/removeRear()函數操作複雜度爲:O(n)
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)
    
d = Deque()
d.addRear(4)
d.addRear('dog')
d.addFront('cat')
d.addFront(True)
print(d.size())
d.addRear(8.4)
print(d.removeRear())
print(d.removeFront())
print(d.isEmpty())
4
8.4
True
False

迴文詞判定

  • 迴文詞指正讀和反讀都是一樣的詞,如radar、山東落花生花落山東
  • 用雙端隊列解決迴文詞問題
    • 先將需要判定的詞從隊尾加入deque
    • 從兩端同時移除字符判定是否相同,直到deque中剩下0個或1個字符
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.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('lsdkjfskf'))
print(palchecker('radar'))
False
True
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章