1 双端队列抽象数据类型及Python实现
-
定义: 双端队列Deque是一种有次序的数据集,跟队列相似,其两端可以称作 “ 首 ”“ 尾 ” 端,但deque 中数据项既可以从队首加入,也可以从队尾加入;数据项也可以从两端移除。某种意义上说,双端队列集成了栈和队列的能力。
-
特性: 双端队列并不具有内在的LIFO (Last in first out) 或者FIFO (First in first out) 特性
1.1 抽象数据类型Deque
Deque()
:创建一个空双端队列addFront(item)
:将item 加入队首addRear(item)
:将item 加入队尾removeFront()
:从队首移除数据项,返回值为移除的数据项removeRear()
:从队尾移除数据项,返回值为移除的数据项isEmpty()
:返回deque 是否为空size()
:返回deque
【操作样例】
Deque Operation | Deque Contents | Return value |
---|---|---|
d.isEmpty() | [] | True |
d.addRear(4) | [4] | |
d.addRear(‘dog’) | [‘dog’,4,] | |
d.addFront(‘cat’) | [‘dog’,4,‘cat’] | |
d.addFront(True) | [‘dog’,4,‘cat’,True] | |
d.size() | [‘dog’,4,‘cat’,True] | 4 |
d.isEmpty() | [‘dog’,4,‘cat’,True] | False |
d.addRear(8.4) | [8.4,‘dog’,4,‘cat’,True] | |
d.removeRear() | [‘dog’,4,‘cat’,True] | 8.4 |
d.removeFront() | [‘dog’,4,‘cat’] | True |
1.2 Python实现ADT Deque
class Deque():
"""
List下标0作为deque的尾端
List下标-1作为deque的首端
"""
def __init__(self):
self.items =[]
def isEmpty(self):
return self.items == []
def addRear(self, item):
"""操作复杂度O(n)"""
self.items.insert(0, item)
def addFront(self, item):
"""操作复杂度O(1)"""
self.items.append(item)
def removeRear(self):
"""操作复杂度O(n)"""
return self.items.pop(0)
def removeFront(self):
"""操作复杂度O(1)"""
return self.items.pop()
def size(self):
return len(self.items)
2 双端队列的应用
2.1 回文词判定算法
“回文词”指正读和反读都一样的词
如: radar 、madam 、toot
上海自来水来自海上
山东落花生花落东山
算法:
用双端队列很容易解决“回文词”问题,先将需要判定的词从队尾加入deque,再从两端同时移除字符判定是否相同,直到deque 中剩下0 个或1个字符。
【代码】
class Deque():...
def palChecker(aString):
charDeque = Deque()
for ch in aString:
charDeque.addRear(ch)
stillEqual = True
while charDeque.size() > 1 and stillEqual:
first = charDeque.removeFront()
last = charDeque.removeRear()
if first != last:
stillEqual = False
return stillEqual
print(palChecker('上海自来水来自海上')) # True
print(palChecker('abcdba')) # False