基本数据结构-队列

以下是关于 队列的基本概念、Python 实现以及应用案例 的详细说明,使用 Markdown 格式进行排版:


一、队列(Queue)

1. 概念

  • 定义:队列是一种有序集合,具有两个主要端部:
    • 队尾(Rear):新元素从这一端添加。
    • 队首(Front):元素从这一端移除。
  • 特性:队列遵循 FIFO(先进先出) 原则,即最先添加的元素最先被移除。

2. 特点

  • 先进先出:类似于现实生活中的排队,如等待看电影、等待结账等。
  • 单向操作:只能从队尾添加元素,从队首移除元素。

3. 应用场景

  • 打印队列:计算机实验室中,多个打印任务排队等待打印。
  • 操作系统调度:操作系统使用队列管理进程调度,确保任务按顺序执行。
  • 键盘输入缓冲:按键内容被存储在队列中,按顺序处理,确保输入的正确性。

二、Python 实现队列

1. 队列的抽象数据类型定义

  • 操作
    • Queue():创建一个空的队列,不需要参数,返回一个空队列。
    • enqueue(item):将新项添加到队尾,需要一个参数 item,不返回任何内容。
    • dequeue():从队首移除项,不需要参数,返回移除的元素。
    • isEmpty():检查队列是否为空,返回布尔值。
    • size():返回队列中的元素数量,返回一个整数。

2. Python 实现

class Queue:
    def __init__(self):
        """创建一个空的队列"""
        self.items = []

    def isEmpty(self):
        """检查队列是否为空"""
        return self.items == []

    def enqueue(self, item):
        """在队尾添加一个元素"""
        self.items.insert(0, item)

    def dequeue(self):
        """从队首移除一个元素"""
        if not self.isEmpty():
            return self.items.pop()
        else:
            raise IndexError("dequeue from empty queue")

    def size(self):
        """返回队列中的元素数量"""
        return len(self.items)

3. 使用示例

q = Queue()

# 检查队列是否为空
print(q.isEmpty())  # True

# 添加元素
q.enqueue("dog")
q.enqueue(4)
q.enqueue(8.4)

# 检查队列大小
print(q.size())  # 3

# 移除元素
print(q.dequeue())  # 输出: dog
print(q.dequeue())  # 输出: 4

# 检查队列大小
print(q.size())  # 1

三、面试题:如何用两个队列实现一个栈

1. 问题描述

  • 使用两个队列 q1q2 模拟栈的行为(LIFO,后进先出)。

2. 实现思路

  • 入栈操作:将所有元素存储在 q1 中。
  • 出栈操作
    1. q1 中的所有元素(除了最后一个)依次出队并入队到 q2
    2. 弹出 q1 中的最后一个元素(即栈顶元素)。
    3. 交换 q1q2 的角色,继续操作。

3. Python 实现

class Queue:
    def __init__(self):
        self.items = []

    def isEmpty(self):
        return self.items == []

    def enqueue(self, item):
        self.items.insert(0, item)

    def dequeue(self):
        if not self.isEmpty():
            return self.items.pop()
        else:
            raise IndexError("dequeue from empty queue")

    def size(self):
        return len(self.items)


# 使用两个队列实现栈
q1 = Queue()
q2 = Queue()
alist = [1, 2, 3, 4, 5]

# 将数据加入队列
for i in alist:
    q1.enqueue(i)

while True:
    while q1.size() > 1:
        item = q1.dequeue()
        q2.enqueue(item)
    print(q1.dequeue())  # 模拟栈的弹出操作

    # 交换 q1 和 q2 的角色
    q1, q2 = q2, q1

    if q1.size() == 0:
        break

4. 输出结果

  • 输入:[1, 2, 3, 4, 5]
  • 输出:
    5
    4
    3
    2
    1
    

四、总结

  • 队列特性:先进先出(FIFO),适用于需要按顺序处理的场景。
  • Python 实现:通过列表操作实现队列的基本功能。
  • 两个队列模拟栈:通过交替使用两个队列,可以实现栈的后进先出(LIFO)特性。

希望这些内容能帮助你更好地理解队列的基本概念及其应用!

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