python中的队列

news/2025/1/7 20:08:36/文章来源:https://www.cnblogs.com/lmc7/p/18655739

在 Python 中,队列(Queue)是一种常见的数据结构,特别是在刷算法题时经常被用到。以下是队列相关的基础语法及其在算法题中的应用总结。


1. 队列的基本定义

队列遵循 FIFO(先进先出) 原则,可以通过以下方式实现:

1) collections.deque

deque 是双端队列,支持快速的两端插入和删除操作。

from collections import deque# 初始化队列
queue = deque()# 入队
queue.append(1)  # 队尾插入
queue.append(2)# 出队
x = queue.popleft()  # 队首弹出# 检查队列是否为空
if not queue:print("Queue is empty")

2) queue.Queue

标准库中的线程安全队列,适合多线程场景。

from queue import Queue# 初始化队列
queue = Queue()# 入队
queue.put(1)
queue.put(2)# 出队
x = queue.get()# 检查队列是否为空
if queue.empty():print("Queue is empty")

2. 队列常见操作

1) 初始化队列

从列表初始化队列:

data = [1, 2, 3, 4]
queue = deque(data)

2) 队列长度

获取队列长度:

length = len(queue)

3) 清空队列

清空队列内容:

queue.clear()

4) 双端操作

deque 支持双端队列操作:

# 队首插入
queue.appendleft(0)# 队尾弹出
x = queue.pop()

3. 算法题中队列的常用场景

1) 广度优先搜索(BFS)

队列是实现 BFS 的核心数据结构,常用于图遍历、最短路径等问题。

from collections import dequedef bfs(graph, start):visited = set()queue = deque([start])visited.add(start)while queue:node = queue.popleft()print(node)  # 访问节点for neighbor in graph[node]:if neighbor not in visited:visited.add(neighbor)queue.append(neighbor)

2) 滑动窗口问题

在滑动窗口中,队列常用来维护窗口中的元素或其索引。

from collections import dequedef max_sliding_window(nums, k):deque_window = deque()result = []for i, num in enumerate(nums):# 移除窗口外的元素if deque_window and deque_window[0] == i - k:deque_window.popleft()# 保持队列单调递减,移除比当前元素小的while deque_window and nums[deque_window[-1]] < num:deque_window.pop()deque_window.append(i)# 记录窗口的最大值if i >= k - 1:result.append(nums[deque_window[0]])return result

3) 拓扑排序

利用队列维护入度为 0 的节点,用于有向图的拓扑排序。

from collections import dequedef topological_sort(graph, indegree):queue = deque([node for node in graph if indegree[node] == 0])result = []while queue:node = queue.popleft()result.append(node)for neighbor in graph[node]:indegree[neighbor] -= 1if indegree[neighbor] == 0:queue.append(neighbor)return result if len(result) == len(graph) else []

4) 多源 BFS

处理多个起点同时进行的 BFS 问题,比如火焰蔓延、病毒扩散等问题。

from collections import dequedef multi_source_bfs(grid):rows, cols = len(grid), len(grid[0])directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]queue = deque()# 将所有起点加入队列for r in range(rows):for c in range(cols):if grid[r][c] == 2:  # 起点条件queue.append((r, c))while queue:x, y = queue.popleft()for dx, dy in directions:nx, ny = x + dx, y + dyif 0 <= nx < rows and 0 <= ny < cols and grid[nx][ny] == 0:grid[nx][ny] = grid[x][y] + 1queue.append((nx, ny))

4. 优先队列

在需要按照优先级弹出元素的场景中,可以使用 heapq 实现最小堆(优先队列)。

import heapqdef process_priority_queue(data):pq = []for item in data:heapq.heappush(pq, item)  # 入堆while pq:print(heapq.heappop(pq))  # 出堆

若需要最大堆,可以将元素取反:

pq = []
heapq.heappush(pq, -1 * value)  # 插入负值
max_val = -1 * heapq.heappop(pq)  # 弹出负值并取反

5. 队列技巧总结

  1. 广度优先搜索(BFS):核心应用场景,用于图论、最短路径、层序遍历等。
  2. 双端队列:滑动窗口、单调队列等问题的利器,支持高效的两端操作。
  3. 优先队列:解决需要动态维护最大值或最小值的场景,如 Huffman 编码、Dijkstra 算法等。
  4. 队列与递归结合:部分问题可以用队列替代递归,避免栈溢出。
  5. 灵活初始化:从数组、起点集合快速构建队列,加速算法实现。

通过这些队列操作,刷算法题中涉及队列的数据结构问题会更加顺畅!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865014.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++从入门到精通(第6版)PDF、EPUB免费下载

《C++从入门到精通(第6版)》从初学者角度出发,以通俗易懂的语言和丰富多彩的实例,详细讲解了C++程序开发需要掌握的知识。本书分为4篇共19章:第1篇是基础知识,包括绪论,数据类型,运算符与表达式,条件判断语句,循环语句,函数,数组、指针和引用,以及构造数据类型;第…

C# typeof()实例详解

原文链接:https://www.cnblogs.com/ybqjymy/p/12902845.html 用于获取类型的 System.Type 对象。typeof 表达式采用以下形式:System.Type type = typeof(int); 备注若要获取表达式的运行时类型,可以使用 .NET Framework 方法 GetType,如下所示:1 int i = 0; 2 System.Type…

PhpStorm 2024.3.1.1 安装激活教程(激活至2026,实际上永久,亲测!)以及常见问题处理

申明:本教程 PhpStorm 补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 !卸载老版本 PhpStorm 首先,如果小伙伴的电脑上有安装老版本的 PhpStorm , 需要将其彻底卸载掉,如下所示(没有安装则不用管,直…

以太网物理层IOP测试设备TESTBASE-EIOP

OPEN联盟(OPEN Alliance)是一个由OEM、Tier1和Tier2共同组建的非盈利开放性的行业联盟,旨在将以太网技术在汽车环境中应用及推广,TESTBASE-EIOP是经纬恒润自主研发的车载以太网物理层IOP(交互性)自动化测试设备,可完整覆盖OPEN TC8 IOP测试标准。背景OPEN联盟(OPEN All…

Linux命令行连接蓝牙设备

Linux命令行连接蓝牙设备 查看Bluetooth设备: hciconfig启动一个Bluetooth设备,例如:hci0: hciconfig hci0 up相关指令查看特定的Bluetooth设备(例如,设备名为hci0): hciconfig hci0关闭一个Bluetooth设备(例如,设备名为hci0): hciconfig hci0 down修改一个Bluetoot…

华为云专家说:开源的商业化之路与开发者技术服务

开源在大量在云技术以及业务中应用,从开源与云的增长模式看,开源与云具有相当程度的相似性。本文来源:《华为云DTSE》第五期开源专刊,作者:华为云开发者支持首席布道师汪盛 开源、云的增长模式与 Product Led Growth具有较大相似性,两者增长立足于产品质量与使用的开发者…

JAVA-Day 06:if语句的三种形式

if语句的三种形式if(表达式){语句体}如果小括号里的表达式结果为真,则执行大括号中的语句体,如下图例子所示:2.if(表达式){语句体}else{语句体} 如果小括号里的表达式为真,则执行else前的大括号中的语句体,如果小括号里的表达式为假,则执行else后的大括号中的语句体。如下图…

Redis可视化工具 Another Redis Desktop Manager工具使用详细教程(附下载链接)

Redis 可视化工具推荐:Another Redis Desktop Manager Redis 是一种高性能的键值数据库,广泛应用于缓存和消息队列等场景。对于开发者来说,命令行工具固然强大,但操作繁琐。而一款高效易用的可视化工具可以极大地提升使用效率。本篇将为大家推荐一款开源、跨平台且功能强大…

跟狂神学习第一天,了解Markdown语法

Markdown学习 一个#+空格+标题名字=大标题/一级标题 二级标题 两个#+空格+标题 = 二级标题 三个#+空格+标题 = 三级标题 .......(以此类推) 一直到六级标题 字体 hello! 粗体:文字两边同时加两个* hello! 斜体:文字两边同时加一个* hello! 斜体加粗:文字两边同时加三个…

Ubuntu换源自用备用

Ubuntu换源(本地) 作者 原文链接:https://blog.csdn.net/MacWx/article/details/137689898 查询系统版本 lsb_release -a系统版本是 Ubuntu 20.04.6 LTS,注意这个开发代号Codename,Ubuntu每一个版本都有一个代号,这个一定要跟国内源对应,否则会出问题。 阿里云Ubuntu镜像…

大规模高性能云网络技术思路

控制面基础架构采用微服务架构模型,服务独立可扩展,可以根据每个服务的规模来部署满足需求的实例。具体网络控制面技术方案如图本文分享自天翼云开发者社区《大规模高性能云网络技术思路》,作者:程****超 控制面基础架构采用微服务架构模型,服务独立可扩展,可以根据每个服…

Python开发环境部署教程

本教程将详细介绍如何在 Windows 系统上配置 Python 开发环境,包括安装 Python、配置虚拟环境以及使用 VS Code 进行开发,适合新手和需要精细配置的开发者。本教程将详细介绍如何在 Windows 系统上配置 Python 开发环境,包括安装 Python、配置虚拟环境以及使用 VS Code 进行…