python中的队列
在 Python 中,队列(Queue)通常使用 collections.deque 来实现,因其提供了高效的从两端添加和删除元素的操作。队列通常遵循 先进先出(FIFO) 的原则,也就是最先插入的元素最先被移除。
队列的基本操作:
append(x): 将元素x加入队列的尾部。popleft(): 移除并返回队列的头部元素。appendleft(x): 将元素x加入队列的头部(虽然一般队列不会使用这个操作,但它也能完成双端队列的操作)。- pop(): 移除并返回队列的尾部元素。
示例代码:
from collections import deque
# 创建一个空的队列
queue = deque()
# 入队(将元素添加到队列的尾部)
queue.append(1) # 队列 -> [1]
queue.append(2) # 队列 -> [1, 2]
queue.append(3) # 队列 -> [1, 2, 3]
# 出队(从队列的头部移除元素)
print(queue.popleft()) # 输出: 1, 队列 -> [2, 3]
print(queue.popleft()) # 输出: 2, 队列 -> [3]
# 查看当前队列内容
print(queue) # 输出: deque([3])
# 再次入队
queue.append(4) # 队列 -> [3, 4]
print(queue) # 输出: deque([3, 4])
# 再次出队
print(queue.popleft()) # 输出: 3, 队列 -> [4]
解释:
append(x):将元素x插入队列的尾部(加入到队列的后面)。popleft():从队列的头部移除并返回元素。这个操作遵循 FIFO(先进先出)原则。
队列的典型应用:
队列的 FIFO 特性使得它非常适用于很多需要保持顺序的应用,尤其是广度优先搜索(BFS)等场景。
队列的算法题使用场景:
-
广度优先搜索(BFS):
- BFS 通常使用队列来逐层遍历图或树的节点。每次处理一个节点时,将其邻接节点按顺序添加到队列中。
from collections import deque def bfs(graph, start): queue = deque([start]) visited = set([start]) while queue: node = queue.popleft() print(node) # 访问节点 for neighbor in graph[node]: if neighbor not in visited: visited.add(neighbor) queue.append(neighbor) graph = { 1: [2, 3], 2: [1, 4], 3: [1], 4: [2] } bfs(graph, 1) # 从节点 1 开始广度优先搜索 -
模拟队列:
队列也经常用于模拟现实世界中的排队场景,比如任务调度、流量控制等。- 在算法题中,通常我们用队列来处理按顺序处理的任务,或者是有限的容量限制任务。
-
滑动窗口算法:
队列在滑动窗口问题中也很常见,尤其是求解 最大值/最小值 等窗口内的一些问题。from collections import deque def maxSlidingWindow(nums, k): queue = deque() result = [] for i, num in enumerate(nums): # Remove elements that are out of this window if queue and queue[0] < i - k + 1: queue.popleft() # Remove elements that are less than the current number while queue and nums[queue[-1]] < num: queue.pop() queue.append(i) if i >= k - 1: result.append(nums[queue[0]]) return result nums = [1,3,-1,-3,5,3,6,7] k = 3 print(maxSlidingWindow(nums, k)) # Output: [3, 3, 5, 5, 6, 7]
重点总结:
-
deque是 Python 中非常高效的队列实现,提供 O(1) 的时间复杂度来在队列两端进行添加和删除操作。 -
队列操作:
append(x):将元素x添加到队尾。popleft():移除并返回队头元素。appendleft(x):将元素x添加到队头(可选,适用于双端队列的场景)。
-
队列是广度优先搜索(BFS)等需要按顺序处理任务的算法中的重要数据结构。
小结:
deque 提供了非常高效的队列操作,并且在广度优先搜索、滑动窗口等算法中非常有用。在刷题中,特别是在处理图、树和序列类问题时,队列(deque)经常被用来维护处理顺序和支持高效的插入/删除操作。

浙公网安备 33010602011771号