双端队列Deque及Python实现
双端队列Deque
与队列类似,双端队列有两个人口,不同之处在于双端队列的两个口都既可以是入口也可以是出口,但数据项只能从两端进出。
所以 栈Stack 中次序遵守 ‘后进先出’ 原则。
双端队列Deque的Python实现
双端队列数据类型的定义如下:
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.isEmpty | [] | True |
d.addRear(1) | [1] | |
d.addRear(‘a’) | [ ‘a’,1] | |
d.addFront(‘bb’) | [1, ‘a’,‘bb’] | |
d.addFront(55) | [1, ‘a’,‘bb’,55] | |
d.size | [1, ‘a’,‘bb’,55] | 4 |
d.removerRear | [ ‘a’,‘bb’,55] | [1] |
d.removerFront | [‘a’,‘bb’] | [55] |
d.isEmpty | [‘a’,‘bb’] | False |
双端队列Deque的应用:“回文词”判断
判断一个词是否是回文词:
如:toot, pop, dad 等就是回文词
用双端队列很容易解决“回文词”问题
先将需要判定的词从队尾加入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 HWC_checker(Str1):
mydeque = Deque() #新建空双端队列
for i in Str1:
mydeque.addRear(i) #将每个字符加入到队列里
while mydeque.size() > 1: #如果队列里有一个以上的元素则执行下面的程序
if mydeque.removeFront() == mydeque.removeRear():
pass
else:
return False #判断首位字符是否相等,如果不相等则返回False
return True #最后队列里还剩一个或者零个数据,则返回True
print(HWC_checker(input()))
学习陈斌老师的数据结构与算法Python版课有感