基本数据结构-队列
以下是关于 队列的基本概念、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. 问题描述
- 使用两个队列
q1
和q2
模拟栈的行为(LIFO,后进先出)。
2. 实现思路
- 入栈操作:将所有元素存储在
q1
中。 - 出栈操作:
- 将
q1
中的所有元素(除了最后一个)依次出队并入队到q2
。 - 弹出
q1
中的最后一个元素(即栈顶元素)。 - 交换
q1
和q2
的角色,继续操作。
- 将
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)特性。
希望这些内容能帮助你更好地理解队列的基本概念及其应用!