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

【7】数据结构的队列篇章

目录标题

    • 队列的定义
    • 顺序队列的实现
      • 初始化
      • 入队
      • 出队
      • 顺序队列总代码与调试
    • 循环队列的实现
      • 初始化
      • 入队
      • 出队
      • 获取队首元素
      • 循环队列总代码与调试
    • 链式队列的实现
      • 链式队列的初始化
      • 入队
      • 出队
      • 获取队首元素
      • 链式队列总代码与调试

队列的定义

  • 定义:队列(Queue)是一种常见的数据结构,它遵循“先进先出”(First In First Out,FIFO)的原则。类似于排队买票的情况,排在前面的先离开队列,后面来的排在队尾。
  • 特点:
    • 队列只允许在一端删除,在另一端插入的线性表
    • 允许删除的一端称为队首,允许插入的一端称为队尾
    • 向队列中插入元素称入队,从队列中删除元素称为出队
  • 队列示意图

在这里插入图片描述

顺序队列的实现

初始化

class SeqQueue:"""顺序队列的定义"""def __init__(self, max):"""顺序队列的初始化:param max: 队列大小"""self.max = max# 存储队列元素self.data = [None for i in range(self.max)]# 队首指针self.front = 0# 队尾指针self.rear = 0

入队

  • 核心思想
    • 检查队列是否已满
    • 在队尾插入元素值
    • 队尾指针加1
  • 入队示意图

在这里插入图片描述

  • 代码实现
    def enter(self, data):"""入队:param data: 入队元素:return:"""# 队满情况if self.rear == self.max:raise IndexError('队列已满')# 在队尾插入新的关键字self.data[self.rear] = data# 队尾指针加1self.rear += 1

出队

  • 核心思想
    • 检查队列是否为空
    • 获取队首元素
    • 队首指针front向后移动一格
  • 出队示意图

在这里插入图片描述

  • 代码实现
    def delete(self):"""出队:return: 出队元素"""# 队空if self.front == self.rear:raise IndexError('队空')# 获取出队元素data = self.data[self.front]# 队首指向下一个元素位置self.front += 1return data

顺序队列总代码与调试

# 10.顺序队列
class SeqQueue:"""顺序队列的定义"""def __init__(self, max):"""顺序队列的初始化:param max: 队列大小"""self.max = max# 存储队列元素self.data = [None for i in range(self.max)]# 队首指针self.front = 0# 队尾指针self.rear = 0def enter(self, data):"""入队:param data: 入队元素:return:"""# 队满情况if self.rear == self.max:raise IndexError('队列已满')# 在队尾插入新的关键字self.data[self.rear] = data# 队尾指针加1self.rear += 1def delete(self):"""出队:return: 出队元素"""# 队空if self.front == self.rear:raise IndexError('队空')# 获取出队元素data = self.data[self.front]# 队首指向下一个元素位置self.front += 1return dataif __name__ == '__main__':print('PyCharm')# 10.队列seqQueue = SeqQueue(8)# 10.1入队seqQueue.enter(10)seqQueue.enter(20)seqQueue.enter(30)# 10.2出队data = seqQueue.delete()print('当前出队元素:', data)data = seqQueue.delete()print('当前出队元素:', data)# 入队seqQueue.enter(40)seqQueue.enter(50)seqQueue.enter(60)# 出队data = seqQueue.delete()print('当前出队元素:', data)data = seqQueue.delete()print('当前出队元素:', data)data = seqQueue.delete()print('当前出队元素:', data)

循环队列的实现

  • 顺序队列易出现队列溢出的情况,针对这种情况的解决思路,设计了循环队列的线性表。
  • 顺序队列中存在的假溢出现象

在这里插入图片描述

  • 循环队列的出入队解决情况

在这里插入图片描述

  • 设定
    • 队首取下一个位置为:(front + 1) % max
    • 队尾取下一个位置为:(rear + 1) % max
    • 队空:front == rear
    • 队满:(rear + 1) % max == front

初始化

  • 初始化
class CSeqQueue:"""顺序队列的定义"""def __init__(self, max):"""顺序队列的初始化:param max: 队列大小"""self.max = max# 存储队列元素self.data = [None for i in range(self.max)]# 队首指针self.front = 0# 队尾指针self.rear = 0
  • 是否为空
    def isEmpty(self):"""循环队列是否为空:return: true or false"""return self.front ==self.rear

入队

  • 核心思想
    • 检查队列是否已满
    • 在队尾插入元素值
    • 取队尾的下一个位置
  • 代码实现
    def enter(self, data):"""入队:param data: 入队元素:return:"""# 队列满的情况if(self.rear + 1)% self.max == self.front:raise IndexError('队列已满')# 在队尾插入dataself.data[self.rear] = data# 修改队尾指针self.rear = (self.rear + 1) % self.max

出队

  • 核心思想
    • 检查队列是否为空
    • 获取队首元素
    • 取队首的下一个位置
  • 代码实现
    def delete(self):"""出队:return: 返回队首元素"""# 队空if self.isEmpty():raise IndexError('队列为空')# 获队首元素data = self.data[self.front]# 修改队首指针self.front = (self.front + 1) % self.max#返回return data

获取队首元素

    def peak(self):"""获取队首元素:return: 队首元素"""# 队空if self.isEmpty():raise IndexError('队列为空')# 返回队首元素return self.data[self.front]

循环队列总代码与调试

# 11.循环队列
class CSeqQueue:"""顺序队列的定义"""def __init__(self, max):"""顺序队列的初始化:param max: 队列大小"""self.max = max# 存储队列元素self.data = [None for i in range(self.max)]# 队首指针self.front = 0# 队尾指针self.rear = 0def isEmpty(self):"""循环队列是否为空:return: true or false"""return self.front ==self.reardef enter(self, data):"""入队:param data: 入队元素:return:"""# 队列满的情况if(self.rear + 1)% self.max == self.front:raise IndexError('队列已满')# 在队尾插入dataself.data[self.rear] = data# 修改队尾指针self.rear = (self.rear + 1) % self.maxdef delete(self):"""出队:return: 返回队首元素"""# 队空if self.isEmpty():raise IndexError('队列为空')# 获队首元素data = self.data[self.front]# 修改队首指针self.front = (self.front + 1) % self.max#返回return datadef peak(self):"""获取队首元素:return: 队首元素"""# 队空if self.isEmpty():raise IndexError('队列为空')# 返回队首元素return self.data[self.front]if __name__ == '__main__':print('PyCharm')# 11.循环队列cseqQueue = CSeqQueue(5)# 入队cseqQueue.enter(10)cseqQueue.enter(20)cseqQueue.enter(30)print('输出队首元素:', cseqQueue.peak())# 出队10data = cseqQueue.delete()print('出队的元素:', data)print('队首元素:', cseqQueue.peak())# 出队20data = cseqQueue.delete()print('出队的元素:', data)print('队首元素:', cseqQueue.peak())# 入队cseqQueue.enter(40)cseqQueue.enter(50)cseqQueue.enter(60)print('队首元素:', cseqQueue.peak())

链式队列的实现

  • 结点设置:与单链表一致,包括数据域data与指针域next。
  • 链式队列示意图
    在这里插入图片描述
  • 代码实现
class Node:"""定义链式队列结点"""def __init__(self, data):# 数据域self.data = data# 指针域self.next = None

链式队列的初始化

  • 初始化
    def __init__(self):"""链式队列初始化"""# 队首结点指向Noneself.front = Node(None)# 队尾指针指向队首self.rear = self.front
  • 是否为空
    def isEmpty(self):"""判断是否为空:return: true or false"""return self.front == self.rear

入队

  • 核心思想
    • 队尾的next指针指向新结点
    • 队尾指针指向新结点
  • 入队示意图
    在这里插入图片描述
  • 代码实现
    def enter(self, data):"""入队:param data: 入队元素值"""# 创建新结点newNode = Node(data)self.rear.next = newNodeself.rear = newNode

出队

  • 核心思想
    • 检查队列是否为空
    • 保留队首结点
    • 将队首结点的next指针指向队首结点的后继结点,实现删除
  • 出队示意图
    在这里插入图片描述
  • 代码实现
    def delete(self):"""出队:return: 出队值"""# 队列为空if self.isEmpty():raise IndexError('队列为空')else:node = self.front.next# 队首结点的next指向队首结点的后继结点self.front.next = node.next# 返回出队结点return node

获取队首元素

    def peak(self):"""获取队首元素:return: 队首元素"""# 队列为空if self.isEmpty():raise IndexError('队列为空')else:# 返回队首元素return self.front.next.data

链式队列总代码与调试

# 链式队列
class Node:"""定义链式队列结点"""def __init__(self, data):# 数据域self.data = data# 指针域self.next = Noneclass LinkedQueue:"""链式队列定义"""def __init__(self):"""链式队列初始化"""# 队首结点指向Noneself.front = Node(None)# 队尾指针指向队首self.rear = self.frontdef isEmpty(self):"""判断是否为空:return: true or false"""return self.front == self.reardef enter(self, data):"""入队:param data: 入队元素值"""# 创建新结点newNode = Node(data)self.rear.next = newNodeself.rear = newNodedef delete(self):"""出队:return: 出队值"""# 队列为空if self.isEmpty():raise IndexError('队列为空')else:node = self.front.next# 队首结点的next指向队首结点的后继结点self.front.next = node.next# 返回出队结点return nodedef peak(self):"""获取队首元素:return: 队首元素"""# 队列为空if self.isEmpty():raise IndexError('队列为空')else:# 返回队首元素return self.front.next.dataif __name__ == '__main__':print('PyCharm')# 12.链式队列linkedQueue = LinkedQueue()# 入队linkedQueue.enter('A')linkedQueue.enter('B')linkedQueue.enter('C')print('输出队首元素:', linkedQueue.peak())# 出队node = linkedQueue.delete()print('出队元素:', node.data)node = linkedQueue.delete()print('出队元素:', node.data)print('输出队首元素:', linkedQueue.peak())

相关文章:

【7】数据结构的队列篇章

目录标题 队列的定义顺序队列的实现初始化入队出队顺序队列总代码与调试 循环队列的实现初始化入队出队获取队首元素循环队列总代码与调试 链式队列的实现链式队列的初始化入队出队获取队首元素链式队列总代码与调试 队列的定义 定义:队列(Queue&#x…...

颜色归一化操作

当我们不太关注图像具体细节,只关注图像大致的内容时,为了避免光照角度、光照强度对图像的影响,可以采用下面进行归一化操作。这种颜色系统具有通道对表面方向、照明方向具有鲁棒性的特性,适用于图像分割等领域,在机器…...

2874. 有序三元组中的最大值 II

给你一个下标从 0 开始的整数数组 。nums 请你从所有满足 的下标三元组 中&#xff0c;找出并返回下标三元组的最大值。 如果所有满足条件的三元组的值都是负数&#xff0c;则返回 。i < j < k(i, j, k)0 下标三元组 的值等于 。(i, j, k)(nums[i] - nums[j]) * nums[k…...

05-Spring Security 认证与授权机制源码解析

Spring Security 认证与授权机制源码解析 结合之前的IOC、AOP、事务管理&#xff0c; 这一篇讲讲Spring 的安全性&#xff0c;以下是小弟对Spring Security的一些理解&#xff0c;以及在真实面试中碰到的一些问题做了些整理&#xff0c;欢迎各位大佬一起观摩指点&#xff01;&a…...

深度学习处理文本(6)

理解词嵌入 重要的是&#xff0c;进行one-hot编码时&#xff0c;你做了一个与特征工程有关的决策。你向模型中注入了有关特征空间结构的基本假设。这个假设是&#xff1a;你所编码的不同词元之间是相互独立的。事实上&#xff0c;one-hot向量之间都是相互正交的。对于单词而言…...

STL-vector的使用

1.STL-vector 向量是可以改变其大小的线性序列容器。向量使用连续的空间存储元素&#xff0c;表明向量可以像数组通过下标来访问元素&#xff0c;但是向量的大小可以动态变化。向量的容量可能大于其元素需要的实际容量&#xff0c;向量通过消耗更多的内存来换取存储管理效率。…...

MySQL深入

体系结构 连接层&#xff1a;主要处理客户端的连接进行授权认证、校验权限等相关操作 服务层&#xff1a;如sql的接口、解析、优化在这里完成&#xff0c;所有跨存储引擎的操作在这里完成 引擎层&#xff1a;索引是在存储引擎层实现的&#xff0c;所以不同的存储引擎他的索引…...

为什么LoRA在目标检测方向不奏效?

最近在思考,为啥目标检测方向没有出现LORA的相关用法,搜索到了一篇文章,挺有深度的。 Why LoRA Struggles with Object Detection (and Why I Learned This the Hard Way) 链接:https://medium.com/predict/why-lora-struggles-with-object-detection-and-why-i-learned-…...

Vue面试常考内容[从宏观到微观]

以下是Vue面试常考内容的系统性解析,从框架设计思想到源码实现细节,结合最新技术动态(截至2025年4月)整理而成: 一、宏观层面:Vue设计哲学与框架定位 渐进式框架核心 • 分层可扩展架构:从视图层核心逐步集成路由、状态管理等能力,支持"按需取用"的渐进式开发…...

Genspark:重新定义搜索体验的AI智能体引擎

关于我们 飞书-华彬智融知识库 由前百度高管景鲲&#xff08;Eric Jing&#xff09;和朱凯华&#xff08;Kay Zhu&#xff09;联合创立的AI搜索引擎Genspark&#xff0c;正以革命性的技术架构和用户导向的设计理念&#xff0c;为全球用户带来一场搜索体验的范式革命。本文将基…...

从零实现Json-Rpc框架】- 项目实现 - 服务端主题实现及整体封装

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

AI助力PPT制作,让演示变得轻松高效

AI助力PPT制作&#xff0c;让演示变得轻松高效&#xff01;随着科技的进步&#xff0c;AI技术早已渗透到各行各业&#xff0c;特别是在办公领域&#xff0c;AI制作PPT已不再是未来的梦想&#xff0c;而是现实的工具。以前你可能需要花费数小时来制作一个完美的PPT&#xff0c;如…...

React-01React创建第一个项目(npm install -g create-react-app)

1. React特点 JSX是javaScript语法的扩展&#xff0c;React开发不一定使用JSX。单向响应的数据流&#xff0c;React实现单向数据流&#xff0c;减少重复代码&#xff0c;比传统数据绑定更简单。等等 JSX是js的语法扩展&#xff0c;允许在js中编写类似HTML的代码 const …...

HTML应用指南:利用POST请求获取三大运营商5G基站位置信息(二)

在当前信息技术迅猛发展的背景下,第五代移动通信(5G)技术作为新一代的无线通信标准,正逐步成为推动社会进步和产业升级的关键驱动力。三大电信运营商(中国移动、中国联通、中国电信)在全国范围内的5G基站部署,不仅极大地提升了网络性能,也为智能城市、物联网、自动驾驶…...

C++学习笔记之内存管理

仅用于记录学习理解 选择题答案及解析 globalVar&#xff1a;C&#xff08;数据段 (静态区)&#xff09; 解析&#xff1a;全局变量存放在数据段&#xff08;静态区&#xff09;&#xff0c;生命周期从程序开始到结束&#xff0c;程序运行期间一直存在。 staticGlobalVar&…...

针对 MySQL 数据库中 主键/唯一约束的更新方法 和 ON DUPLICATE KEY UPDATE 语法的详细说明及示例,并以表格总结

以下是针对 MySQL 数据库中 主键/唯一约束的更新方法 和 ON DUPLICATE KEY UPDATE 语法的详细说明及示例&#xff0c;并以表格总结&#xff1a; 一、主键的更新 1. 更新主键的条件 允许更新&#xff1a;MySQL 允许更新主键列&#xff0c;但需满足以下条件&#xff1a; 唯一性…...

day21 学习笔记

文章目录 前言一、删除数据二、索引操作1.loc方法2.iloc方法 三、添加数据1.loc方法添加数据2.concat方法拼接数据 四、重置索引 前言 通过今天的学习&#xff0c;我掌握了对Pandas对象数据元素进行增删操作以及重置索引的操作 一、删除数据 DataFrame.drop(labelsNone, axis…...

【MyBatis】深入解析 MyBatis XML 开发:增删改查操作和方法命名规范、@Param 重命名参数、XML 返回自增主键方法

增删改查操作 接下来&#xff0c;我们来实现一下用户的增加、删除和修改的操作。 增( Insert ) UserInfoMapper接口&#xff1a; 我们写好UserInfoMapper接口后&#xff0c;自动生成 XML 代码&#xff1b; UserInfoMapper.xml实现&#xff1a; 增删改查方法命名规范 如果我们…...

【Pandas】pandas DataFrame select_dtypes

Pandas2.2 DataFrame Attributes and underlying data 方法描述DataFrame.index用于获取 DataFrame 的行索引DataFrame.columns用于获取 DataFrame 的列标签DataFrame.dtypes用于获取 DataFrame 中每一列的数据类型DataFrame.info([verbose, buf, max_cols, …])用于提供 Dat…...

使用Python构建Kafka示例项目

新建项目 mkdir python-kafka-test cd python-kafka-test 安装依赖 pip install confluent_kafka 创建配置文件 # Kafka配置文件# Kafka服务器配置 KAFKA_CONFIG {bootstrap.servers: localhost:9092,# 生产者特定配置producer: {client.id: python-kafka-producer,acks:…...

本地化部署DeepSeek-R1蒸馏大模型:基于飞桨PaddleNLP 3.0的实战指南

目录 一、飞桨框架3.0&#xff1a;大模型推理新范式的开启1.1 自动并行机制革新&#xff1a;解放多卡推理1.2 推理-训练统一设计&#xff1a;一套代码全流程复用 二、本地部署DeepSeek-R1-Distill-Llama-8B的实战流程2.1 机器环境说明2.2 模型与推理脚本准备2.3 启动 Docker 容…...

VBA 64位API声明语句第008讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…...

Linux信号——信号的保存(2)

关于core和term两种终止方式 core是什么&#xff1f; 将进程在内存中的核心数据&#xff08;与调试有关&#xff09;转存到磁盘中形成core,core.pid的文件。 core dump&#xff1a;核心转储。 core与term的区别&#xff1a; term只是普通的终止&#xff0c;而core终止方式还要…...

PyQt6实例_A股日数据维护工具_权息数据增量更新线程

目录 前置&#xff1a; 代码&#xff1a; 1 工作类 2 数据库交互 3 主界面启用子线程 视频&#xff1a; 前置&#xff1a; 1 本系列将以 “PyQt6实例_A股日数据维护工具” 开头放置在“PyQt6实例”专栏 专栏地址 https://blog.csdn.net/m0_37967652/category_12929760.h…...

【蓝桥杯嵌入式——学习笔记一】2016年第七届省赛真题重难点解析记录,闭坑指南(文末附完整代码)

在读题过程中发现本次使用的是串口2&#xff0c;需要配置串口2。 但在查看产品手册时发现PA14同时也是SWCLK。 所以在使用串口2时需要拔下跳线帽去连接CH340。 可能是用到串口2的缘故&#xff0c;在烧录时发现报了一个错误。这时我们要想烧录得按着复位键去点击烧录&#xff0c…...

基础常问 (概念、代码)

读源码 代码题 Void方法 &#xff0c;也可以提前rerun;结束 RandomAccessFile类&#xff08;随机访问文件&#xff09; 在 Java 中&#xff0c;可以使用RandomAccessFile类来实现文件指针操作。RandomAccessFile提供了对文件内容的随机访问功能&#xff0c;它的文件指针可以通…...

大学生机器人比赛实战(一)综述篇

大学生机器人比赛实战 参加机器人比赛是大学生提升工程实践能力的绝佳机会。本指南将全面介绍如何从零开始准备华北五省机器人大赛、ROBOCAN、RoboMaster等主流机器人赛事&#xff0c;涵盖硬件设计、软件开发、算法实现和团队协作等关键知识。 一、比赛选择与准备策略 1.1 主…...

什么是宽带拨号?

宽带拨号&#xff08;PPPoE拨号&#xff09;是一种通过账号密码认证接入互联网的方式&#xff0c;常见于家庭宽带、企业专线等场景。用户需要通过路由器或电脑进行拨号连接&#xff0c;运营商验证身份后分配IP地址&#xff0c;才能正常上网。 1. 宽带拨号的工作原理 PPPoE协议&…...

J1 ResNet-50算法实战与解析

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習紀錄博客&#x1f356; 原作者&#xff1a;K同学啊 | 接輔導、項目定制 一、理论知识储备 1. 残差网络的由来 ResNet主要解决了CNN在深度加深时的退化问题&#xff08;梯度消失与梯度爆炸&#xff09;。 虽然B…...

[MySQL初阶]MySQL(8)索引机制:下

标题&#xff1a;[MySQL初阶]MySQL&#xff08;8&#xff09;索引机制&#xff1a;下 水墨不写bug 文章目录 四、从问题到底层&#xff0c;从现象到本质1.为什么插入的数据默认排好序2.MySQL的Page&#xff08;1&#xff09;为什么选择用Page&#xff1f;&#xff08;2&#x…...