文章目录
一、双端队列
双端队列Deque是一种有次序的数据集
- 跟队列相似,其两端可以称作**“首”“尾”**端,但数据项既可以从队首加入,也可以从队尾加入;数据项也可以从两端移除。某种意义上说,双端队列集成了栈和队列的能力。
- 但双端队列并不具有内在的LIFO或者FIFO特性。如果用双端队列来模拟栈或队列,需要由使用者自行维护操作的一致性
抽象数据类型-双端队列Deque
方法名 | 描述 | 返回值 |
---|---|---|
Deque() | 创建一个空双端队列 | 无返回值 |
addFront(item) | 将item加入队首 | 无返回值 |
addRear(item) | 将item加入队尾 | 无返回值 |
removeFront() | 从队首移除数据项,返回值为移除的数据项 | 移除的数据项 |
removeRear() | 从队尾移除数据项,返回值为移除的数据项 | 移除的数据项 |
isEmpty() | 返回deque是否为空 | 布尔值(True/False) |
size() | 返回deque中包含数据项的个数 | 整数(数据项的个数) |
用Python实现ADT Deque
- 约定:队首是列表的末端;队尾是列表的首端。(也可以倒过来)
class Deque:
def __init__(self):
self.items = []
def add_front(self, item):
self.items.append(item)
def add_rear(self, item):
self.items.insert(0, item)
def remove_front(self):
return self.items.pop()
def remove_rear(self):
return self.items.pop(0)
def is_empty(self):
return len(self.items) == 0
def size(self):
return len(self.items)
二、双端队列应用-回文词判定
“回文词”指正读和反读都一样的词
- 例如英文中的:radar、madam、toot。中文中的:“上海自来水来自海上”,“山东落花生花落东山”
- “回文词”判定:
- 先将需要判定的词加入deque
- 再从两端同时移除字符判定是否相同,直到deque中剩下0个或1个字符
from my_deque import Deque
def pal_checker(expression):
if len(expression) == 1: # 排除只有一个字的情况
return False
char_deque = Deque()
for i in expression:
char_deque.add_front(i)
while char_deque.size() > 1:
front = char_deque.remove_front()
rear = char_deque.remove_rear()
if front != rear:
return False
return True
print(pal_checker("madam"))
print(pal_checker("a"))
print(pal_checker("山东落花生花落东山"))
### 输出结果
True
False
True
您正在阅读的是《数据结构与算法Python版》专栏!关注不迷路~