什么是双端队列Deque?
双端队列是一种有次序的数据集。跟队列相似,其两端可以称作“首”“尾”端,但Deque中数据项既可以从队首加入,也可以从队尾加入;也可以从两端移除,某种意义上来讲,双端队列集成了栈和队列的能力。
但双端队列并不具有内在的LIFO或者FIFO特性,如果用双端队列来模拟栈或队列,需要由使用者自行维护操作的一致性
Deque基本操作
- Deque(): 创建一个空双端队列
- addFront(item): 将item加入队首
- addRear(item): 将item加入队首
- removeFront(): 从队首移除数据项,返回值为移除的数据项
- removeRear(): 从队尾移除数据项,返回值为移除的数据项
- isEmpty(): 返回deque是否为空
- size(): 返回deque中包含数据项的个数
python实现ADT Deque
列表首段端为栈顶
class Deque:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def addFront(self,item):
self.items.append(0,item)
def addRear(self,item):
self.item.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)
双端队列之"回文词判断"
回文词指正读和反读都一样的词
如:toot,madam,radar......
思路:先将需要判定的词从队尾加入,再从两端同时移除字符判定是否相同,直到deque中剩下0个或1个字符
代码实现:
from pythonds.basic.deque import Deque
# 创建用于判断的方法
def palchecker(aString):
# 初始化空双端队列
chardeque = Deque()
# 字符串进行遍历,加入到队列中
for ch in aString:
chardeque.addRear(ch)
# 标记为True
stillEqual = True
# 但数量大于1
while chardeque.size() > 1 and stillEqual:
# 队首取出来
first = chardeque.removeFront()
# 队尾取出来
last = chardeque.removeRear()
# 如果不相等
if first != last:
stillEqual = False
# 相等返回True
return stillEqual
print(palchecker('nvken'))