什么是双端队列
双端队列Deque是一种次序的数据集,跟队列相似,其两端可以称作“首”,“尾”端,但deque中数据项集可以从队首加入,也可以从队尾加入;数据项也可以从两端移除。
某种意义上说,双端队列集成了栈的队列的能力
但双端队列并不具有内在的LIFO或者FIFO特性,如果用双端队列来模拟栈或队列,需要由使用者自信维护操作的一致性
ADT双端队列
deque定义的操作如下
- Deque():创建一个空双端队列
- addFront(item):将item加入队首
- addRear(item):将item加入队尾
- removeFront():从队首移除数据项,返回值为移除的数据项
- removeRear():从队尾移除数据项,返回值为移除的数据项
- isEmpty():返回deque是否为空
- size():返回deque中包含数据项的个数
双端队列的实现
class Deque:
def __init__(self):
self.items = []
def isEmpty(self):
return len(self.items)==0
def size(self):
return len(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)
双端队列的应用1 “回文词的判定”
回文词指正读与反读都一样的词
如radar、madam、toot
中文“上海自来水来自海上”
“山东落花生花落东山”
用双端队列很容易解决“回文词”问题
先将需要判定的词从队尾加入deque
再从两端同时移除字符,判定是否相同,直到deque中剩下0个或1个字符
回文词判定代码:
def huiwen(str_):
D = Deque()
for i in str_:
D.addRear(i)
x = 1
while D.size()>1:
a = D.removeRear()
b = D.removeFront()
if a != b:
x = 0
break
if x == 1:
print("这是回文词")
else:
print('这不是回文词')
huiwen("rada")
huiwen('上海自来水来自海上')