基本数据结构-双端队列(Deque)
以下是关于 双端队列(Deque) 的详细说明和 Python 实现,使用 Markdown 格式进行排版:
一、双端队列(Deque)
1. 概念
- 定义:双端队列(Deque,Double-Ended Queue)是一种有序集合,类似于队列,但具有两个端部:首部(Front) 和 尾部(Rear)。元素在集合中的顺序保持不变。
2. 特性
- 灵活性:Deque 的特殊之处在于,添加和删除操作是非限制性的。可以在 首部或尾部 添加新元素,也可以从 首部或尾部 删除元素。
- 功能强大:Deque 结合了栈(Stack)和队列(Queue)的特性,提供了更灵活的操作方式。
- 无固定顺序:与栈(LIFO)和队列(FIFO)不同,Deque 不强制要求特定的顺序。具体操作取决于使用场景。
二、Python 实现 Deque
1. Deque 的抽象数据类型定义
- 操作:
Deque()
:创建一个空的 Deque,不需要参数,返回一个空的 Deque。addFront(item)
:在 Deque 的首部添加一个元素,需要一个参数item
,不返回任何内容。addRear(item)
:在 Deque 的尾部添加一个元素,需要一个参数item
,不返回任何内容。removeFront()
:从 Deque 的首部移除一个元素,不需要参数,返回移除的元素。removeRear()
:从 Deque 的尾部移除一个元素,不需要参数,返回移除的元素。isEmpty()
:检查 Deque 是否为空,不需要参数,返回一个布尔值。size()
:返回 Deque 中的元素数量,不需要参数,返回一个整数。
2. Python 实现
class Deque:
def __init__(self):
"""创建一个空的 Deque"""
self.items = []
def isEmpty(self):
"""检查 Deque 是否为空"""
return self.items == []
def addFront(self, item):
"""在 Deque 的首部添加一个元素"""
self.items.append(item)
def addRear(self, item):
"""在 Deque 的尾部添加一个元素"""
self.items.insert(0, item)
def removeFront(self):
"""从 Deque 的首部移除一个元素"""
if not self.isEmpty():
return self.items.pop()
else:
raise IndexError("removeFront from empty Deque")
def removeRear(self):
"""从 Deque 的尾部移除一个元素"""
if not self.isEmpty():
return self.items.pop(0)
else:
raise IndexError("removeRear from empty Deque")
def size(self):
"""返回 Deque 中的元素数量"""
return len(self.items)
3. 测试代码
# 创建一个空的 Deque
dq = Deque()
# 添加元素
dq.addFront(10)
dq.addRear(20)
dq.addFront(5)
dq.addRear(30)
# 查看 Deque 的内容
print("Deque content:", dq.items) # 输出: [30, 20, 10, 5]
# 移除元素
print("Removed from front:", dq.removeFront()) # 输出: 5
print("Removed from rear:", dq.removeRear()) # 输出: 30
# 查看 Deque 的内容
print("Deque content:", dq.items) # 输出: [20, 10]
# 检查是否为空
print("Is Deque empty?", dq.isEmpty()) # 输出: False
# 查看 Deque 的大小
print("Deque size:", dq.size()) # 输出: 2
三、应用场景
- 回文检测:利用 Deque 的首尾操作特性,可以高效地检查字符串是否为回文。
- 多端操作:在需要同时从首部和尾部操作数据的场景中,Deque 提供了极大的灵活性。
- 模拟栈和队列:Deque 可以模拟栈(LIFO)和队列(FIFO)的行为,具体取决于操作方式。
四、总结
- Deque 的优势:
- 提供了栈和队列的特性,操作灵活。
- 首尾操作的时间复杂度均为 O(1)。
- 适用场景:
- 需要同时从首部和尾部操作数据。
- 需要动态模拟栈或队列的行为。
希望这个实现和说明能帮助你更好地理解双端队列(Deque)的特性及其应用!