双端队列定义
双端队列Deque是一种有次序的数据集
- 跟队列相似,其两端可以称作“首”“尾”端,但deque中数据项既可以从队首加入,也可以从队尾加入;数据项也可以从两端移除。
- 某种意义上说,双端队列集成了栈和队列的能力
![image-20230721113524035](https://i-blog.csdnimg.cn/blog_migrate/876d64863484c2b074db2e7bc94e35d4.png)
但双端队列并不具有内在的LIFO或者FIFO特性
- 如果用双端队列来模拟栈或队列需要由使用者自行维护操作的一致性
双端队列定义操作
- Deque():创建一个空双端队列
- addFront(item):将item加入队首
- addRear(item):将item加入队尾
- removeFront():从队首移除数据项,返回值为移除的数据项
- removeRear():从队尾移除数据项,返回值为移除的数据项
- isEmpty():返回deque是否为空
- size():返回deque中包含数据项的个数
![image-20230721113740974](https://i-blog.csdnimg.cn/blog_migrate/8279594fd04fc72cc6b71600521e81f9.png)
算法实现
class Deque:
def __init__(self):
self.items = []
def is_empty(self):
return self.items == []
# 下标0作为deque尾端,下标-1作为deque首端
def add_rear(self, item): # 尾端入队 O(n)
self.items.insert(0, item)
def add_front(self, item): # 首端入队 O(1)
self.items.append(item)
def remove_rear(self): # 尾端出队 O(n)
return self.items.pop(0)
def remove_front(self): # 首端出队 O(1)
return self.items.pop()
def size(self):
return len(self.items)
双端队列应用
回文词判定
回文词”指正读和反读都一样的词
用双端队列很容易解决“回文词”问题
- 先将需要判定的词从队尾加入deque再从两端同时移除字符判定是否相同,直到deque中剩下0个或1个字符
def palchecker(astring):
chardeque = Deque()
for ch in astring:
chardeque.add_rear(ch)
still_equal = True
while chardeque.size() > 1 and still_equal:
left = chardeque.remove_rear()
right = chardeque.remove_front()
if left != right:
still_equal = False
return still_equal
print(palchecker("lsdkjfskf")) # False
print(palchecker("radar")) # True