当前位置: 首页 > news >正文

python小记-队列

队列(Queue)是一种常见的数据结构,它遵循先进先出(First-In-First-Out,FIFO)的原则。在队列中,新元素(也称为项)总是添加到队列的末尾,而最早添加的元素总是在队列的前面,类似于排队等待的现象。

队列的主要操作包括:

  1. 入队(enqueue):将新元素添加到队列的末尾。
  2. 出队(dequeue):从队列的前面移除最早添加的元素。
  3. 判空(isEmpty):检查队列是否为空,如果队列中没有任何元素,则返回True,否则返回False。
  4. 获取队首元素(front):获取队列的前面最早添加的元素,但不移除它。

队列常用的实现方式包括:

  1. 数组实现:使用数组来存储队列的元素,入队和出队的时间复杂度为O(1)。
  2. 链表实现:使用链表来存储队列的元素,入队和出队的时间复杂度为O(1)。

队列在计算机科学和算法中有广泛的应用,例如:

  1. 广度优先搜索(BFS):在图的遍历和搜索中,BFS使用队列来实现按层次遍历图的节点。
  2. 任务调度:在操作系统中,任务调度器使用队列来管理待执行的任务,按照优先级和先后顺序进行调度执行。
  3. 线程池:在多线程编程中,线程池使用队列来存储待执行的任务,从队列中取出任务分配给空闲线程执行。

在Python中,可以使用内置的collections模块中的deque类来实现队列。deque是一个双端队列,支持高效的在两端进行元素的添加和删除操作。以下是使用deque实现队列的示例:

from collections import deque# 创建一个空队列
queue = deque()# 入队操作
queue.append(1)
queue.append(2)
queue.append(3)# 出队操作
first_element = queue.popleft()
print(first_element)  # 输出: 1# 获取队首元素
front_element = queue[0]
print(front_element)  # 输出: 2

以上代码演示了如何使用deque来实现队列的入队和出队操作,并获取队首元素。

图的BFS

当使用BFS算法解决问题时,队列起到了关键的作用。以下是一个详细的例子,演示了如何使用队列来实现BFS算法解决图的遍历问题。

假设有以下图的表示:

   1---2/ \  |0---3-4

我们想要按层次遍历这个图的节点,从节点0开始。首先,我们将节点0入队列,并标记为已访问。然后,我们从队列中取出节点0,并将其所有未访问的相邻节点入队列。接着,我们继续从队列中取出节点,直到队列为空。每次取出节点后,我们将该节点标记为已访问,并将其所有未访问的相邻节点入队列。

下面是使用队列实现BFS算法的Python代码:

from collections import deque# 定义图的邻接表表示
graph = {0: [1, 3],1: [0, 2, 3],2: [1, 4],3: [0, 1, 4],4: [2, 3]
}# 使用队列实现BFS算法
def bfs(start_node):visited = set()  # 用一个集合来保存已访问过的节点queue = deque()  # 使用deque作为队列queue.append(start_node)visited.add(start_node)while queue:current_node = queue.popleft()  # 取出队列头部的节点print(current_node)  # 输出当前节点for neighbor in graph[current_node]:if neighbor not in visited:queue.append(neighbor)  # 将未访问过的相邻节点入队列visited.add(neighbor)  # 标记相邻节点为已访问# 从节点0开始进行BFS遍历
bfs(0)

输出结果为:

0
1
3
2
4

这是因为我们按层次遍历图的节点,从节点0开始,先输出0的所有相邻节点,然后依次输出1、3、2和4的所有相邻节点。注意,由于图中有环,我们使用集合来记录已访问过的节点,避免重复访问。通过队列和集合的组合,我们实现了高效的BFS算法,能够广泛应用于图的遍历和搜索问题。

树的层次遍历

队列在树中的应用主要体现在树的层次遍历(也称为广度优先搜索 BFS)上。在树的层次遍历中,我们从树的根节点开始,依次按层次遍历树的所有节点。使用队列可以帮助我们实现这种层次遍历的顺序。

下面是一个使用队列实现树的层次遍历的Python代码:

from collections import deque# 定义树的节点类
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right# 使用队列实现树的层次遍历
def level_order_traversal(root):if not root:return []result = []queue = deque()  # 使用deque作为队列queue.append(root)while queue:current_level = []  # 用于存储当前层次的节点值level_size = len(queue)for _ in range(level_size):node = queue.popleft()current_level.append(node.val)if node.left:queue.append(node.left)if node.right:queue.append(node.right)result.append(current_level)return result# 创建一个示例树
#       1
#      / \
#     2   3
#    / \   \
#   4   5   6
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.right.right = TreeNode(6)# 进行树的层次遍历
print(level_order_traversal(root))

输出结果为:

[[1], [2, 3], [4, 5, 6]]

在这个例子中,我们使用队列实现了树的层次遍历,按层次输出树的节点值。首先将树的根节点1入队列,然后依次取出1并将其左右子节点2和3入队列,接着取出2并将其左右子节点4和5入队列,最后取出3并将其右子节点6入队列。按层次遍历的顺序依次输出了树的节点值。这样的层次遍历对于树的结构分析和广度优先搜索问题非常有用。

相关文章:

python小记-队列

队列(Queue)是一种常见的数据结构,它遵循先进先出(First-In-First-Out,FIFO)的原则。在队列中,新元素(也称为项)总是添加到队列的末尾,而最早添加的元素总是在…...

SpringBoot——持久化技术

简单介绍 在之前我们使用的数据层持久化技术使用的是MyBatis或者是MyBatis-plus,其实都是一样的。在使用之前,我们要导入对应的坐标,然后配置MyBatis特有的配置,比如说Mapper接口,或者XML配置文件,那么除了…...

Kafka 入门到起飞 - 生产者参数详解 ,什么是生产者确认机制? 什么是ISR? 什么是 OSR?

上回书我们讲了,生产者发送消息流程解析传送门 那么这篇我们来看下,生产者发送消息时几个重要的参数详解 ,什么是生产者确认机制? 什么是ISR? 什么是 OSR? 参数: bootstrap.servers : Kafka 集…...

【文献分享】比目前最先进的模型轻30%!高效多机器人SLAM蒸馏描述符!

论文题目:Descriptor Distillation for Efficient Multi-Robot SLAM 中文题目:高效多机器人SLAM蒸馏描述符 作者:Xiyue Guo, Junjie Hu, Hujun Bao and Guofeng Zhang 作者机构:浙江大学CAD&CG国家重点实验室 香港中文大学…...

【数据动态填充到element表格;将带有标签的数据展示为文本格式】

一&#xff1a;数据动态填充到element表格&#xff1b; 二&#xff1a;将带有标签的数据展示为文本格式&#xff1b; 1、 <el-row><el-col :span"24"><el-tabs type"border-card"><el-tab-pane label"返回值"><el-…...

小程序轮播图的两种后台方式(PHP)--【浅入深出系列008】

微信目录集链接在此&#xff1a; 详细解析黑马微信小程序视频–【思维导图知识范围】难度★✰✰✰✰ 不会导入/打开小程序的看这里&#xff1a;参考 让别人的小程序长成自己的样子-更换window上下颜色–【浅入深出系列001】 文章目录 本系列校训学习资源的选择啥是轮播图轮播…...

使用ComPDFKit PDF SDK 构建iOS PDF阅读器

在当今以移动为先的世界中&#xff0c;为企业和开发人员创建一个iOS应用程序是必不可少的。随着对PDF文档处理需求的增加&#xff0c;使用ComPDFKit这个强大的PDF软件开发工具包&#xff08;SDK&#xff09;来构建iOS PDF阅读器和编辑器可以让最终用户轻松查看和编辑PDF文档。 …...

一套流程6个步骤,教你如何正确采购询价

采购询价&#xff08;RFQ&#xff09;是一种竞争性投标文件&#xff0c;用于邀请供应商或承包商就标准化或重复生产的产品或服务提交报价。 询价通常用于大批量/低价值项目&#xff0c;买方必须提供技术规格和商业要求&#xff0c;该文件有时也称为招标书或投标邀请书。询价流…...

git使用

常用命令 git init git库初始化&#xff0c;初始化后会在文件中出现一个.git的隐藏文件 git clone 从远程克隆仓库 git pull 从远程库中拉取 git commit 将暂存提交到本地仓库 git push 提交本地仓库到远程 git branch 查看当前分支 git branch <branchName> 切换分支 …...

SkyWalking链路追踪-搭建-spring-boot-cloud-单机环境 之《10 分钟快速搭建 SkyWalking 服务》

首先了解一下单机环境 第一步&#xff0c;搭建一个 Elasticsearch 服务。第二步&#xff0c;下载 SkyWalking 软件包。第三步&#xff0c;搭建一个 SkyWalking OAP 服务。第四步&#xff0c;启动一个 Spring Boot 应用&#xff0c;并配置 SkyWalking Agent。第五步&#xff0c;…...

Rabbit MQ整合springBoot

一、pom依赖二、消费端2.1、application.properties 配置文件2.2、消费端核心组件 三、生产端3.1、application.properties 配置文件2.2、生产者 MQ消息发送组件四、测试1、生产端控制台2、消费端控制台 一、pom依赖 <dependency><groupId>org.springframework.boo…...

Golang 中的 time 包详解(一):time.Time

在日常开发过程中&#xff0c;会频繁遇到对时间进行操作的场景&#xff0c;使用 Golang 中的 time 包可以很方便地实现对时间的相关操作。接下来的几篇文章会详细讲解 time 包&#xff0c;本文先讲解一下 time 包中的结构体 time.Time。 time.Time time.Time 类型用来表示一个…...

CMU 15-445 -- Database Recovery - 18

CMU 15-445 -- Database Recovery - 18 引言ARIESLog Sequence NumbersNormal ExecutionTransaction CommitTransaction AbortCompensation Log Records Non-fuzzy & fuzzy CheckpointsSlightly Better CheckpointsFuzzy Checkpoints ARIES - Recovery PhasesAnalysis Phas…...

HTTP Header定制,客户端使用Request,服务器端使用Response

在服务器端通过request.getHeaders()是无效的&#xff0c;只能使用response.getHeaders()。 Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType mediaType,Class selectedConverterType, ServerHttpRequest request, ServerHttpRespo…...

Vue 3编写的父子组件示例,包括传递数据和调用父组件方法

下面是一个使用Vue 3编写的父子组件示例&#xff0c;包括传递数据和调用父组件方法&#xff1a; ChildComponent.vue&#xff1a; <template><div><p>Child Component</p><p>Message: {{ message }}</p><button click"updateMes…...

[ 容器 ] Docker 的数据管理

目录 一、Docker 的数据管理1.1 数据卷2. 数据卷容器 二、 端口映射三、容器互联&#xff08;使用centos镜像&#xff09;四、Docker 镜像的创建1&#xff0e;基于现有镜像创建2&#xff0e;基于本地模板创建3&#xff0e;基于Dockerfile 创建3.1 联合文件系统&#xff08;Unio…...

【环境配置】使用Docker搭建LAMP环境

这篇文章不是介绍DOCKER是什么&#xff0c;也不是阐述DOCKER的核心&#xff1a;镜像/容器和仓库之间的关系,它只是一篇让刚刚接触DOCKER的初学者&#xff0c;在没有完全了解DOCKER是什么之前,也能尽快的在Linux系统下面通过DOCKER来搭建一个LAMP环境&#xff0c;这是其一&#…...

MLIR (Multi-Level Intermediate Representation)

MLIR&#xff08;Multi-Level Intermediate Representation&#xff09;是一种多级中间表示的编译器基础架构&#xff0c;旨在提供通用的、可扩展的编译器基础设施。它最初由谷歌开发&#xff0c;并且现在已经成为一个开源项目&#xff0c;受到广泛关注和采用。 MLIR 的设计理…...

VR全景在酒店的发展状况如何?酒店该如何做营销?

现阶段&#xff0c;VR全景技术已经被酒店、民宿、旅游景区、房产楼盘、校园等行业所应用&#xff0c;每天都有不少人通过VR全景展示来了解酒店的设施环境&#xff0c;而酒店也可以借此机会&#xff0c;详细展示自身优势&#xff0c;更大范围吸引顾客。 VR酒店拥有真实、立体的全…...

Winform使用PictureBox控件显示图片并且自适应

一.首先我们只需要在项目文件中的/bin/Debug 下面创建一个文件夹保存你的照片。我这里文件夹名字叫Resources.。如图&#xff1a; 二. 然后我们把我们的照片放入Resources文件夹中即可。如图&#xff1a; 三.在构造器中添加picturebox控件。如图&#xff1a; 四.我们到初始化代…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...