一、双端队列(Deque)
概念:deque(也称为双端队列)是与队列类似的项的有序集合。它有两个端部,首部和尾部,并且项在集合中保持不变。
特性:deque 特殊之处在于添加和删除项是非限制性的。可以在前面或后面添加新项。同样,可以从任一端移除现有项。在某种意义上,这种混合线性结构提供了单个数据结构中的栈和队列的所有能力。
注意:即使 deque 可以拥有栈和队列的许多特性,它不需要由那些数据结构强制的 LIFO 和 FIFO 排序。这取决于你如何持续添加和删除操作。
二、Python实现Deque
Deque的抽象数据类型应该由以下结构和操作定义。其中元素可以从首部或尾部的任一端添加和移除。Deque操作如下:
- Deque() 创建一个空的新 deque。它不需要参数,并返回空的 deque。
- addFront(item) 将一个新项添加到 deque 的首部。它需要 item 参数 并不返回任何内容。
- addRear(item) 将一个新项添加到 deque 的尾部。它需要 item 参数并不返回任何内容。
- removeFront() 从 deque 中删除首项。它不需要参数并返回 item。deque 被修改。
- removeRear() 从 deque 中删除尾项。它不需要参数并返回 item。deque 被修改。
- isEmpty() 测试 deque 是否为空。它不需要参数,并返回布尔值。
- size() 返回 deque 中的项数。它不需要参数,并返回一个整数。
创建双端队列:
# 创建双端队列
class Dequeue():
def __init__(self):
self.items = []
# 从队列头部插入数据
def addFont(self,item):
self.items.insert(0,item)
# 从队列尾部插入数据
def addRear(self,item):
self.items.append(item)
# 队头取出元素
def removeFont(self):
return self.items.pop()
# 队尾取元素
def removeRear(self):
return self.items.pop(0)
# 获取队列长度
def size(self):
return len(self.items)
队列测试:
q = Dequeue()
q.addFont(1)
q.addFont(2)
q.addFont(3)
# print(q.removeFont())
# print(q.removeFont())
# print(q.removeFont())
print(q.removeRear())
print(q.removeRear())
print(q.removeRear())
# 结果>>>
3
2
1
三、双端队列的应用案例(回文检查)
回文检测:设计程序,检测一个字符串是否为回文。
回文:回文是一个字符串,读取首尾相同的字符,例如,radar toot madam
。
分析:该问题的解决方案将使用 deque 来存储字符串的字符。我们从左到右处理字符串,并将每个字符添加到 deque 的尾部。在这一点上,deque 像一个普通的队列。然而,我们现在可以利用 deque 的双重功能。 deque 的首部保存字符串的第一个字符,deque 的尾部保存最后一个字符。我们可以直接删除并比较首尾字符,只有当它们匹配时才继续。如果可以持续匹配首尾字符,我们最终要么用完字符,要么留出大小为 1 的deque,取决于原始字符串的长度是偶数还是奇数。在任一情况下,字符串都是回文。
# 实例:回文检测
def isHuiWen(s):
de = Dequeue()
ex = True
# 条件需要测试的回文数据
for sr in s:
de.addFont(sr)
# 回文长度大于1时
while de.size() > 1:
# 删除队首元素(pop出队列右边的最后一个值)
# 删除队尾元素(pop出队列左边的第一个值)
if de.removeFont() != de.removeRear():
ex = False
break
# 返回测试结果:回文(True),不是回文(False)
return ex
回文测试:
print(isHuiWen('abcba'))
# 结果>>>True
print(isHuiWen('adfdba'))
# 结果>>>False