1.什么是双端队列Deque?
双端队列Deque是一种有次序的数据集。
队列的每一端都可以插入数据项和移除数据项。
例如下面的表情包,就是:
大佬可以从左边加入退出,也可以从右边加入退出~
某种意义上说,双端队列集成了栈和队列的能力
双端队列并不具有内在的LIFO或者 FIFO特性。如果用双端队列来模拟栈或队列,需要由使用者自行维护操作的一致性。也就是说,可以自己去实现队列或者栈。
2.抽象数据类型Deque
deque定义的操作如下:
1)Deque():创建一个空双端队列
2)addFront(item):将item加入队首
3)addRear(item):将item加入队尾
4)removeFront():从队首移除数据项,返回值为移除的数据项
5)removeRear():从队尾移除数据项,返回值为移除的数据项
6)isEmpty():返回deque是否为空
7)size():返回deque中包含数据项的个数
以左边为队尾,右边为队首的一个双端队列操作案例:
3.Python实现ADT Deque
如何用python实现抽象数据类型的双端队列?
采用 List 列表来实现
List 索引 0 作为双端队列的尾端
List 索引 -1 作为 双端队列的首端。
操作复杂度:
addFront/removeFront O(1);
addRear/removeRear O(n)
代码:
class Dequeue():
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 removeFront(self):
return self.items.pop(0)
def size(self):
return len(self.items)
4.应用:“回文词”判定
回文词”指正读和反读都一样的词
如:radar、madam、toot; 中文“上海自来水来自海上” “山东落花生花落东山”
那么问题来了,怎么判断一个词是不是回文词?
用双端队列很容易解决“回文词”问题
先将需要判定的词(逐字符)从队尾加入deque;
再从两端同时移除字符判定是否相同,如果相同,继续判断,不同,不是回文词
直到 deque中剩下0个或1个字符,奇数的话剩下一个字符,偶数剩下0个字符,那么就是回文词了。
from pythonds.basic.deque import Deque
def palchecker(aString):
#定义一个双端队列
chardeque = Deque()
#把字符逐一放入队列中
for ch in aString:
chardeque.addRear(ch)
stillEqual = True
#如果字符的长度大于1
while chardeque.size()>1 and still:
#队首移除一个字符
first = chardeque.removeFront()
#队尾移除一个字符
last = chardeque.removeRear()
#队首队尾不相等,不是回文词
if first != last:
still = False
#回文词
return still
#调用函数判断是不是回文词
print(palchecker("radar"))