基本数据结构-双端队列(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)的特性及其应用!

posted @ 2021-07-13 15:13  杨梅杨梅  阅读(570)  评论(0)    收藏  举报