一、什么是双端队列Deque
- 跟队列相似,其两端可以称作“首”“尾”端,但deque中数据项既可以从队首加入,也可以从队尾加入;数据项也可以从两端移除。某种意义上说,双端队列集成了栈和队列的能力。
二、抽象数据类型Deque
2.1 Deque的基本操作
函数 | 含义 |
---|---|
Deque() | 创建一个空双端队列 |
addFront(item) | 将item加入队首 |
addRear(item) | 将item加入队尾 |
removeFront() | 从队首移除数据项,返回值为移除的数据项 |
removeRear() | 从队尾移除数据项,返回值为移除的数据项 |
isEmpty() | 返回deque是否为空 |
size() | 返回deque中包含数据项的个数 |
2.2 Python实现ADT Queue
- 采用List实现
– List下标0作为deque的尾端
– List下标-1作为deque的首端 - 操作复杂度
– 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)
三、双端队列的应用
3.1 回文词的判定
“回文词”指正读和反读都一样的词
算法流程
- 先将需要判定的词从队尾加入deque
- 再从两端同时移除字符判定是否相同,直到deque中剩下0个或1个字符
#from pythonds.basic.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("abcdefedcba"))