python学习笔记(14)算法(7)队列

队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断加入队列尾部,而位于队列头部的人逐个离开。

我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删除队首元素的操作称为“出队”。

一、队列的常用操作

一、入队(Enqueue)

  1. 操作含义

        将元素添加到队列的末尾。

     2.示例(以Python为例,使用列表来简单模拟队列)

  • queue = []
    element = 10
    queue.append(element)
    print(queue)  # [10]

二、出队(Dequeue)

  1. 操作含义
    • 移除队列头部的元素,并返回该元素的值。
  2. 示例(以Python为例)
    • queue = [10, 20, 30]
      front_element = queue.pop(0)
      print(front_element)  # 10
      print(queue)  # [20, 30]

三、查看队首元素(Peek)

  1. 操作含义
    • 返回队列头部的元素,但不移除它。
  2. 示例(以Python为例)
    • queue = [10, 20, 30]
      front_element = queue
      print(front_element)  # 10
      print(queue)  # [10, 20, 30]

四、判断队列是否为空(Is Empty)

  1. 操作含义
    • 检查队列中是否有元素,如果没有元素则返回True,否则返回False。
  2. 示例(以Python为例)
    • queue = []
      is_empty = len(queue)==0
      print(is_empty)  # True
      queue = [10]
      is_empty = len(queue)==0
      print(is_empty)  # False

五、获取队列大小(Size)

  1. 操作含义
    • 返回队列中元素的数量。
  2. 示例(以Python为例)
    • queue = [10, 20, 30]
      size = len(queue)
      print(size)  # 3

 二、具体实现

1.基于链表的实现 

# 首先定义链表节点类
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextclass LinkedListQueue:""" 基于链表实现的队列"""def __init__(self):""" 构造方法"""self._front = None  # 头节点frontself._rear = None   # 尾节点rearself._size = 0def size(self) -> int:""" 获取队列的长度"""return self._sizedef is_empty(self) -> bool:""" 判断队列是否为空"""return self._size == 0def push(self, num: int):""" 入队"""# 在尾节点后添加numnode = ListNode(num)# 如果队列为空,则令头、尾节点都指向该节点if self._front is None:self._front = nodeself._rear = nodeelse:self._rear.next = nodeself._rear = nodeself._size += 1def pop(self) -> int:""" 出队"""if self.is_empty():raise IndexError("队列为空")num = self._front.val# 删除头节点self._front = self._front.nextself._size -= 1if self._front is None:self._rear = Nonereturn numdef peek(self) -> int:""" 访问队首元素"""if self.is_empty():raise IndexError("队列为空")return self._front.valdef to_list(self) -> list[int]:""" 转化为列表用于打印"""queue = []temp = self._frontwhile temp:queue.append(temp.val)temp = temp.nextreturn queue

2.基于数组的实现 

在数组中删除首元素的时间复杂度为 𝑂(𝑖) ,这会导致出队操作效率较低。然而,我们可以采用以下巧妙方法来避免这个问题。
我们可以使用一个变量 front 指向队首元素的索引,并维护一个变量 size 用于记录队列长度。定义
rear = front + size ,这个公式计算出的 rear 指向队尾元素之后的下一个位置。
 

class ArrayQueue:""" 基于环形数组实现的队列"""def __init__(self, size: int):""" 构造方法"""self._nums =  * size# 用于存储队列元素的数组self._front = 0# 队首指针,指向队首元素self._size = 0# 队列长度def capacity(self) -> int:""" 获取队列的容量"""return len(self._nums)def size(self) -> int:""" 获取队列的长度"""return self._sizedef is_empty(self) -> bool:""" 判断队列是否为空"""return self._size == 0def push(self, num: int):""" 入队"""if self._size == self.capacity():raise IndexError("队列已满")# 计算队尾指针,指向队尾索引 + 1# 通过取余操作实现 rear 越过数组尾部后回到头部rear = (self._front + self._size) % self.capacity()# 将 num 添加至队尾self._nums[rear] = numself._size += 1def pop(self) -> int:""" 出队"""if self.is_empty():raise IndexError("队列为空")num = self.peek()# 队首指针向后移动一位,若越过尾部,则返回到数组头部self._front = (self._front + 1) % self.capacity()self._size -= 1return numdef peek(self) -> int:""" 访问队首元素"""if self.is_empty():raise IndexError("队列为空")return self._nums[self._front]def to_list(self) -> list[int]:""" 返回列表用于打印"""res = []index = self._frontfor _ in range(self._size):res.append(self._nums[index])index = (index + 1) % self.capacity()return res

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

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

相关文章

【金蝶双线指标】以看资金进出操作为主,兼顾波段跟踪和短线低吸

如上图,个股副图指标,大佬资金监控短线低吸攻击线操盘线趋势红蝴蝶,五大功能于一体。下面慢慢给大家仔细分享。 大佬资金监控指标,红绿进出,绿色缩小到极致,接近零轴,红绿柱分界线,为…

多输入多输出 | Matlab实现TCN-GRU时间卷积神经网络结合门控循环单元多输入多输出预测

多输入多输出 | Matlab实现TCN-GRU时间卷积神经网络结合门控循环单元多输入多输出预测 目录 多输入多输出 | Matlab实现TCN-GRU时间卷积神经网络结合门控循环单元多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现TCN-GRU时间卷积…

HCIA笔记4--VLAN划分

1. vlan是什么 vlan: virtual lan; 虚拟局域网的简称。 主要目的是隔离广播域。 2. vlan报文格式 在普通的以太网数据帧开关的12字节后添加4字节的vlan tag。而来区分vlan的是其中的vid部分12个比特位,范围自然就是0~2^12-1(0~4095); 0 4095保留使用。实际使用的是…

蓝牙定位的MATLAB仿真程序|基于信号强度的定位,平面、四个蓝牙基站(附源代码)

这段代码通过RSSI信号强度实现了蓝牙定位,展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。它涵盖了信号衰减模型、距离计算和最小二乘法估计等基本概念。通过图形化输出,用户可以直观地看到真实位置与估计位置的关系。 文章目录 蓝牙定位原…

基于Springboot企业级工位管理系统【附源码】

基于Springboot企业级工位管理系统 效果如下: 系统登录页面 员工主页面 部门信息页面 员工管理页面 部门信息管理页面 工位信息管理页面 工位分配管理页面 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所。…

Spring Boot教程之十: 使用 Spring Boot 实现从数据库动态下拉列表

使用 Spring Boot 实现从数据库动态下拉列表 动态下拉列表(或依赖下拉列表)的概念令人兴奋,但编写起来却颇具挑战性。动态下拉列表意味着一个下拉列表中的值依赖于前一个下拉列表中选择的值。一个简单的例子是三个下拉框,分别显示…

SpringBoot源码-spring boot启动入口ruan方法主线分析(一)

一、SpringBoot启动的入口 1.当我们启动一个SpringBoot项目的时候,入口程序就是main方法,而在main方法中就执行了一个run方法。 SpringBootApplication public class StartApp {public static void main(String[] args) {// testSpringApplication.ru…

AI 助力开发新篇章:云开发 Copilot 深度体验与技术解析

本文 一、引言:技术浪潮中的个人视角1.1 AI 和低代码的崛起1.2 为什么选择云开发 Copilot? 二、云开发 Copilot 的核心功能解析2.1 自然语言驱动的低代码开发2.1.1 自然语言输入示例2.1.2 代码生成的模块化支持 2.2 实时预览与调整2.2.1 实时预览窗口功能…

vscode的markdown扩展问题

使用vscode编辑markdown文本时,我是用的是Office Viewer(Markdown Editor)这个插件 今天突然发现不能用了,点击切换编辑视图按钮时会弹出报错信息: command office.markdown.switch not found 在网上找了很久发现没有有关这个插件的文章………

从零开始学 Maven:简化 Java 项目的构建与管理

一、关于Maven 1.1 简介 Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。Maven 的设计目标是提供一种更加简单、一致的方法来构建和管理项目,它通过使用一个标准的目录布局和一…

去哪儿大数据面试题及参考答案

Hadoop 工作原理是什么? Hadoop 是一个开源的分布式计算框架,主要由 HDFS(Hadoop 分布式文件系统)和 MapReduce 计算模型两部分组成 。 HDFS 工作原理 HDFS 采用主从架构,有一个 NameNode 和多个 DataNode。NameNode 负…

守护进程

目录 守护进程 前台进程 后台进程 session(进程会话) 前台任务和后台任务比较好 本质 绘画和终端都关掉了,那些任务仍然在 bash也退了,然后就托孤了 ​编辑 守护进程化---不想受到任何用户登陆和注销的影响​编辑 如何…

element ui select绑定的值是对象的属性时,显示异常.

需要声明 value-key"value". el-select v-model"value" clearable placeholder"Select" value-key"value" style"width: 240px"><!-- <el-option v-for"item in options" :key"item.value" :…

SAAS美容美发系统架构解析

随着技术的不断发展&#xff0c;SAAS&#xff08;Software as a Service&#xff0c;软件即服务&#xff09;模式在各个行业的应用逐渐深化&#xff0c;美容美发行业也不例外。传统的美容美发店面通常依赖纸质记录、手动操作和复杂的管理流程&#xff0c;而随着SAAS平台的出现&…

[代码随想录Day24打卡] 93.复原IP地址 78.子集 90.子集II

93.复原IP地址 一个合法的IP地址是什么样的&#xff1a; 有3个’.分割得到4个数&#xff0c;每个数第一个数不能是0&#xff0c;不能含有非法字符&#xff0c;不能大于255。 这个是否属于合法IP相当于一个分割问题&#xff0c;把一串字符串分割成4部分&#xff0c;分别判断每…

Java学习笔记--继承方法的重写介绍,重写方法的注意事项,方法重写的使用场景,super和this

目录 一&#xff0c;方法的重写 二&#xff0c;重写方法的注意事项 三&#xff0c;方法重写的使用场景 四&#xff0c;super和this 1.继承中构造方法的特点 2.super和this的具体使用 super的具体使用 this的具体使用 一&#xff0c;方法的重写 1.概述:子类中有一个和父类…

gRPC 双向流(Bidirectional Streaming RPC)的使用方法

gRPC 是一个支持多种语言的高性能 RPC 框架&#xff0c;拥有丰富的 API 来简化服务端和客户端的开发过程。gRPC 支持四种 RPC 类型&#xff1a;Unary RPC、Server Streaming RPC、Client Streaming RPC 和 Bidirectional Streaming RPC。下面是双向流 API 的使用方法。 双向流…

npm install -g@vue/cli报错解决:npm error code ENOENT npm error syscall open

这里写目录标题 报错信息1解决方案 报错信息2解决方案 报错信息1 使用npm install -gvue/cli时&#xff0c;发生报错&#xff0c;报错图片如下&#xff1a; 根据报错信息可以知道&#xff0c;缺少package.json文件。 解决方案 缺什么补什么&#xff0c;这里我们使用命令npm…

【ComfyUI】前景分割ComfyUI-BiRefNet-Hugo (无法选定分割的主体,背景鉴别由模型数据,也叫二分分割,显著性分割)

源码&#xff1a;https://github.com/ZhengPeng7/BiRefNet comfyui插件&#xff1a;https://github.com/MoonHugo/ComfyUI-BiRefNet-Hugo 模型下载地址&#xff1a;https://huggingface.co/ZhengPeng7/BiRefNet 工作流以及相关资源下载&#xff1a;https://pan.baidu.com/s/1-U…

大数据技术之Spark :我快呀~

在 MapReduce 为海量数据的计算服务多年后&#xff0c;随着时代的发展和 Spark 等新技术的出现&#xff0c;它的劣势也慢慢的凸显出来了&#xff1a; 执行速度慢。编程复杂度过高。 先看第一点 2000 年代诞生的 MapReduce &#xff0c;因为计算资源有限&#xff0c;所以 Map…