数据结构——队列的构建

news2024/11/26 22:37:18

  在本次博客当中我们来学习一下队列的构建。首先来介绍一下队列。队列也是一种被限制的线性表。队列要求我们其中的元素只可以从队尾进入从队头出数据。也就是说我们先进入队列的数据就会先出队列。所以我们可以将我们的两种线性表改编成为我们的队列。话题又回到了我们两种线性表我们应该选择哪一种呢?

  假如我们依旧使用顺序表的话,我们每次从队尾插入数据,这一步操作很简单,但是我们删除数据呢?需要从队头进行数据的删除。按照我们顺序表的构建我们需要将后面的数据依次向前移动覆盖前面的数据以达到数据覆盖的效果。这样就会造成我们时间上的损耗。所以我们对于队列的构建就采用链表的形式。假如需要插入数据我们就采用尾插的函数,假如我们想要删除数据就采用头删的函数。

  那么问题又来了:我们需要采用双向链表还是单链表呢?我们来分析一下:对于我们的队列我们需要在队尾插入元素,在我们链表的构建当中我们只能通过遍历才可以找到链表的最后一个元素,从这一点来看使用双循环链表似乎更具有优势。但是我们再来分析一下我们的队列,队列当中其他功能的完善似乎并不需要用到循环链表当中的功能,所以我们可以考虑能不能将我们单链表进行完善一下,直接使用单链表实现我们的队列。

  方法肯定是有的,我们只需要在我们链表当中增加一个尾节点即可。也就是构建如下的结构体:

c32531cf108f4eecb804f9b9a7de9d69.png

  在这一个结构体当中我们需要做到的是统帅大局,也就是将我们这个结构体看成一个完整的队列,在这个结构体当中保存着队列的头节点,尾节点,以及节点的个数。

  但是按照我们正常的链表的构建我们还需要构建一个一个的小的节点,并使用next指针将我们这些节点串联起来,所以我们就又需要构建一个结构体:

990e11e337324f1794b74a4814d57b17.png

  接着我们就可以按照我们正常的链表的编写逻辑进行队列的构建了。同样的我们先将我们在队列当中需要实现的函数按照思维导图的形式展示出来:

c064aed13c2a4119b072c7a794f77318.png     🌵初始化队列

  对于我们队列的初始化就是将我们宏观上调控队列的结构体进行初始化操作,也就是将我们的head和tail置空,再将size归零即可。所示代码如下:

c421dcc279f148acb902c2d1e06dcafd.png 

    🌵 向队列当中插入数据

  只要是需要增添数据的函数我们首先要考虑的都是是否需要扩容或者是开辟新的数据空间。所以我们需要先实现一个用于开辟新的节点的函数:

fa6444a71d0749af8aca725c3c74c4b2.png

  之后我们将我们开辟好的新节点链接给我们的队列即可。(实质上就是独自构建一个链表将我们构建好的链表的头节点和尾节点赋值给我们队列的结构体即可。)在如数据的时候我们需要考虑如何将我们的每一个节点连接起来。我们依旧使用next指针进行连接,但是沃尔玛呢需要先判断情况,如果我们队列当中没有数据也就是size为0,那么我们就需要将我们的头节点和尾节点都更改为我们新开辟的节点。如果我们的队列当中已经存在数据,那么我们只需要更改我们的尾节点的地址即可。在完成一切操作之后再进行 size++ 让我们队列保存的数据和实质上的个数一致。所示的代码如下:

008dd584d06448d99a7be3c3cdab518a.png   通过调试所检测我们上述代码的运行效果:

3f7c1b1c173247c7b88a0e0ad5df56c8.png   我们会发现我们依次插入的1,2,3,4一切正常。我们可以进行其他函数的编写。 

    🌵 从队头拿出数据

  从队列当中拿出数据换句话来说就是从我们的队列当中删除一个元素。当我们需要进行数据的删除的时候我们需要先判断一下我们队列当中是否存在数据。如果不存在数据就不允许再进行数据的删除。之后将我们队列当中的头指针指向我们的next指针即可。所示的代码如下:

39ebbf3f0ed745e8989443d34a1e2f95.png

  我们将头节点更改完毕之后将我们原本的头节点释放,并将我们的size--即可。通过调试进行检测情况如下:

9c8a04638942478692569a0b6056ca46.png   我们通过调试会发现我们原本队列当中的1也就是我们头节点当中的元素已经被我们删除了。代码运行一切正常。继续编写其它部分的代码。 

    🌵 判断队列的大小

  对于判断队列的大小,这个函数超级简单。还记得我们之前在队列当中增加的size变量吗?有了这个变量我们在编写这个函数就不需要在进行遍历链表了。我们只需要将我们的size作为返回值返回即可,代码如下:

d07212542d68485dbe3c5e61126bc14b.png

  我们可以在主函数当中调用这个函数进行检测我们这项功能是否正常:

9c31e321c9194b83aed1f85232e29967.png   我们先向队列当中插入四个数据之后再删除一个数据所以我们队列当中剩下三个数据我们调用函数所输出的数据的个数也为3,所以我们这部分的函数运行一切正常。 

    🌵 队列的判空

  对于队列的判空我们只需要对size进行判断是否等于0即可,如果为0就代表我们的队列为空,就返回true,否则就返回false。所示代码如下:

f472b28ddd724a618a4d8ae045dacd7b.png

  同样的我们可以对我们的函数进行检测:

689dd61c6cc749dfa21718f9e8586310.png 

5f95674025da4c69993157a6ae324224.png   如上图所示,我们对于队列的判空操作无论是队列为空还是队列不为空的检测都正常。 

    🌵 返回队头元素

  返回队头元素的函数同样十分的简单。我们只需要返回我们头节点所指向的节点当中所存储的元素即可。所示代码如下:

74d6baafc7844a4aac1712785e11a3c7.png

  对我们上述的函数进行检测:

a896f992bae44c28be629c233a5b1fd1.png   我们的队头元素也确实为1,所以函数运行正常。 

    🌵 返回队尾元素

  返回队尾元素我们只需要直接返回我们的队尾节点所指向的元素即可。所示的代码如下:

151ce9a0bc784b9d9038d36923d5b593.png

  上述代码的运行效果如下:

268457727b784b3e96a28f9a20d9d222.png   函数功能正常。 

    🌵 销毁队列

  最后我们需要实现的就是我们的销毁队列的函数了。对于队列的销毁函数和我们链表的销毁函数相同。我们只需要先创建一个节点变量接受我们原先的头节点之后再将我们的头节点指向我们的next指针指向的地址即可。之后再将我们使用变量保存好的原先头节点的地址释放。最后依次循环进行此操作,一直到所有的节点均释放。我们这一部分所示的代码如下:

9a9c9a3c3aa74fc49f1e02d2b57b6b89.png

  在完成上述所有的函数之后我们队列的构建也就全部完成了。相对于我们链表的构建来说队列的创建就显得简单很多了,大家会发现我们的栈和队列看起来有很大的不同,要是让大家使用栈构建一个队列或者使用队列构建一个栈呢?我们将在下一次的博客当中实现这两种数据结构之间的相互转换。感谢您的观看,再见。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法记录 | Day44 动态规划

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

【初学人工智能原理】【3】梯度下降和反向传播:能改(上)

前言 本文教程均来自b站【小白也能听懂的人工智能原理】,感兴趣的可自行到b站观看。 本文【原文】章节来自课程的对白,由于缺少图片可能无法理解,故放到了最后,建议直接看代码(代码放到了前面)。 代码实…

itop-3568开发板驱动学习笔记(24)设备树(三)时钟实例分析

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 生产者属性#clock-cells 属性clock-output-namesclock-frequencyassigned-clockclock-indicesassigned-clock-parents 消费者属性 设备树中的时钟信息以时钟树形式体现,时钟树包括时钟的属性和结…

C#_语言简介

目录 1. C# 简介 2. Visual Studio 窗口界面显示 1. C# 简介 什么是程序? 程序(Program)简单来说就是: 计算机是无法听懂我们人类的语言的,也可以说我们通过我们日常交流的语言是无法控制计算机的,计算机…

排序算法 - 快速排序

文章目录 快速排序介绍快速排序实现快速排序时间复杂度和稳定性快速排序稳定性快速排序时间复杂度 代码实现核心&总结 每日一道算法,提高脑力。第二天,快速排序。 快速排序介绍 它的基本思想是: 选择一个基准数,通过一趟排序将要排序的…

Spring容器技术

Spring容器技术 1. Spring核心容器介绍1.1 创建容器1.2 获取bean对象1.3 容器类层次结构1.4 BeanFactory 2. Spring核心容器总结2.1 容器相关2.2 bean相关2.3 依赖注入相关 1. Spring核心容器介绍 问题导入 问题:按照Bean名称获取Bean有什么弊端,按照B…

(七)ArcCatalog应用基础——图层操作与数据输出

(七)ArcCatalog应用基础——图层操作与数据输出 目录 (七)ArcCatalog应用基础——图层操作与数据输出 1.地图与图层操作1.1创建图层1.2设置文件特征1.3保存独立的图层文件 2.地理数据输出2.1输出为Shapefile2.2输出为Coverage2.3属…

[Spring]初始导读

1.Spring初始 1. 为什么要学框架 学习框架相当于从"小作坊"到"工厂"的升级 , 小作坊什么都要做 , 工厂是组件式装配 , 特点就是高效. 2.框架的优点展示(SpringBoot Vs Servlet) 使用SpringBoot 项目演示框架相比 Servlet 所具备的以下优点: 无需配置 …

KDZD电缆安全双枪刺扎器

一、产品背景 多年以来,电力电缆的维护迁移过程中的识别与刺孔,均按照行业标准DL409-91《电业安全工作规程(电力线路部分)》第234条要求,采用人工刺孔,一旦电缆识别出错,误刺孔带电电缆将对人身…

Win11调整分区大小的方法有哪些?

电脑磁盘分区的大小关系着我们的系统运行流畅、文件数据分门别类、磁盘空间充分利用等,是一个非常重要的工作。那么Win11调整分区大小的方法有哪些? 使用命令提示符 缩小分区 步骤1. 在搜索框中输入cmd并以管理员身份运行命令提示符。 步骤2. 依次输入…

分布式事务TCC 你真的理解了吗

TCC(补偿事务) TCC 属于目前比较火的一种柔性事务解决方案。TCC 这个概念最早诞生于数据库专家帕特 赫兰德(Pat Helland)于 2007 发表的 《Life beyond Distributed Transactions: an Apostate’s Opinion》 这篇论文&#xff0…

本地 WAF 已死,云 WAF 永生

多年来,Web 应用程序防火墙 (WAF) 一直是应用程序保护的代名词。事实上,许多应用程序安全团队认为保护其应用程序的最佳选择是一流的本地 WAF 解决方案,尤其是当这些应用程序部署在本地或私有云中时。 但自从引入本地 WAF 以来,…

授权码 + PKCE 模式|OIDC OAuth2.0 认证协议最佳实践系列【03】

​ 在上一篇文章中,我们介绍了 OIDC 授权码模式(点击下方链接查看),本次我们将重点围绕 授权码 PKCE 模式(Authorization Code With PKCE)进行介绍 ,从而让你的系统快速具备接入用户认证的标准…

R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习

详情点击链接:R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习 Meta分析的选题与文献检索 Meta分析Meta分析的选题策略文献检索数据库精确检索策略,如何检索全、检索准文献的管理与清洗,如何制定文献纳入排除标准文献数据获取技…

( 哈希表) 128. 最长连续序列 ——【Leetcode每日一题】

❓128. 最长连续序列 难度:中等 给定一个未排序的整数数组 nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O ( n ) O(n) O(n) 的算法解决此问题。 示例 1: 输入…

ai数字人无限播是什么?数字人直播带货如何搭建?操作教程及注意事项分享

随着数字技术的不断进步,直播行业也在不断的发展壮大。其中,数字人直播成为了最为热门的直播方式之一。数字人直播利用AI技术创建出的虚拟数字人进行直播,给观众带来了全新的视觉体验。而随着数字人直播的不断发展,数字人直播带货…

力扣(LeetCode)1172. 餐盘栈(C++)

优先队列 解题思路:根据题意模拟。用数组存储无限数量的栈。重在实现 p u s h push push 和 p o p pop pop 操作。 对于 p u s h push push 操作,需要知道当前从左往右第一个空栈的下标。分两类讨论: ①所有栈都是满的,那么我…

基于台风信息查询 API 设计台风预警系统的基本思路

引言 在过去的几十年中,由于全球气候变化等因素的影响,台风的强度和频率都有所增加,给人类社会带来了极大的威胁。在这种背景下,一个高效可靠的台风预警和监测系统显得尤为重要。这种系统可以通过获取、存储、处理和分析各种相关…

产业数字化爆发,松山湖开发者村打通数实融合“最后一公里”

2023年正值第四次工业革命新十年开始之际,也是我国数字经济量质齐升新十年的开幕。2022年,中国全部工业增加值突破40万亿元大关,占GDP比重达33.2%,制造业规模连续13年位居世界首位。当以工业和制造业为代表的实体产业,…

过来人转本考试后的感悟和经验,真的很受用

过来人转本考试后的感悟和经验,真的很受用!转本不仅是分数的较量,也是信息收集、时间管理、学习能力、毅力等等的较量。同学们在转本中难免会遇见一些困难,为了避免走弯路,一起来看看过来人的感悟和经验吧!…