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

初阶数据结构------队列的实现

目录

前言

队列的介绍

队列的实现

声明

实现

初始化

销毁

入队列

出队列

队列中元素个数

队列是否为空

取队尾元素

取队首元素


前言

此博客较为详细地讲解了如何基于C语言中的链表,实现一种非常重要的数据结构--队列

队列的介绍

首先,什么是队列呢?队列是一种特殊的线性表。所谓线性表是一类在逻辑结构上连续的数据结构的统称。

队列只允许在其一端插入数据,即入队列;在其另一端删除数据,即出队列。插入数据的一端被称为队尾,删除数据的一端被称作队头。同时队列还遵守FIFO(先进先出)原则,即不管数据先入几个再入几个,数据只有一种出队列的顺序。

队列的实现

那我们怎么具体实现队列呢?我们立刻能想到数组和链表两种方式。相比于数组,链表实现队列要更优一些。为什么呢?如果我们基于数组实现一个动态的队列除了每次扩容的消耗外,我们在删除数据时还要移动后面的元素,要麻烦许多。所以这里我们讲的是基于链表实现一个队列。

那我们怎么基于链表实现队列呢?我们假设将链表的头作为队头,链表的尾作为队尾,这里我们需要两个指针,一个指向队头,另一个指向队尾。在入队列时,我们只需要申请一个新的节点,让尾结点的next指针指向新节点,再让rear指针指向新申请的节点即可。那删除数据呢?我们只需要把第一个节点释放了,再改变head指针的指向即可。经过这么一分析,链表很好的契合了队列的要求。

声明

下面就看具体的代码实现部分了。

Queue.h文件中我们首先包含一下后续会使用到的头文件。

接着我们来定义队列的节点,每一个节点都包含两个成员:存的数据val和下一个节点的地址next。

接下来注意了!我们再设计一个新的结构体struct Queue。

那我们为什么要设计这个结构体呢?这就需要结合我们需要实现的一些方法来说了。

我们后续会实现一些有关队列的方法,包括初始化、销毁、入队列、出队列等等。在实现这些方法,我们就以队列的初始化为例。要将队列初始化,我们就要把head指针还有rear指针都置为空。所以在函数中我们如果想通过形参的改变来影响实参,这个时候我们就需要传变量的地址了,在这里也就是二级指针。也就是说我们需要传递两个二级指针。这样不论在使用还是维护时都非常的麻烦。所以,我们这里就设计一个结构体struct Queue,然后把两个指针都放在这个结构体里面,然后后续我们直接传递结构体的地址就能在函数中改变head和rear这两个指针的指向了。

那么我为什么又在结构体中加了一个成员size呢?这依然和我们后续会实现的方法有关。我们后续会实现一个方法,也就是展示队列中的元素个数。正常来说的话,我们每次在调用这个函数的时候都要从头遍历一次我们的链表,时间复杂度为O(N),这样的未免有些麻烦。

所以我们就在设计的结构体中加一个成员size,后续每次入队列时我们都让size加一,出队列时再让它减一,这样在实现展示队列中的元素个数时,我们直接return size就行了。

实现

前面铺垫了那么多,我们就可以直接进入代码部分了。我们就开始一个一个的实现我们的方法。

初始化

首先是初始化,这里没什么好说的,直接将head和rear指针置空,再把size置为0即可。

销毁

接下来是队列的销毁

在销毁队列时就有个细节要注意了,我们的队列是在堆上申请的,如果我们只是将head和rear指针置空但是堆上的队列并没有销毁,这要就会导致内存泄漏。所以我们要先释放队列的每个节点再把指针置空。

入队列

然后就是入队列了。入队列分为两种情况。一种是队列为空,另一种是队列不为空。队列为空时我们就要同时改变head和rear指针的指向了。队列不为空,我们只需要让尾节点指向新节点,再让rear指针指向新的尾节点即可。最后不要忘了让size++。

出队列

再就是出队列。注意队列的数据都是从队头出队列的。首先队列不能为空,我们用assert暴力判断一下。我们保存一下第一个节点的下一个节点的地址再把第一个节点释放了最后再改变head指针的指向即可。注意!!!这里有坑!当队列只有一个节点时我们把节点释放后,改变了head指针的指向,但是rear指针并没有改变,它指向的空间已经被释放了,rear指针也就成了野指针。后续在使用的过程中后有可能会出现非法访问的问题。所以这里我们得判断一下,如果只有一个节点那么rear指针也要置空!最后不要忘了让size--。

队列中元素个数

这里没什么好说的,直接return obj中的size即可。

队列是否为空

我们直接利用size来判断即可。

取队尾元素

先判断一下obj是否有效以及队列是否为空,再直接返回rear节点中的值即可。

取队首元素

同样,我们先判断一下,再直接返回head节点中的值即可。

以上就是本篇博客中的所有内容了,希望对大家有帮助,有问题也欢迎指正交流。

http://www.jsqmd.com/news/841011/

相关文章:

  • 在多轮长对话场景下观察Taotoken接口响应延迟的稳定性表现
  • 如何用MultiHighlight插件彻底解决代码阅读难题:终极指南
  • 组蛋白翻译后修饰:基因组功能的因与果
  • AI 内容一键导出工具新手实战指南
  • 彻底告别桌面混乱:NoFences桌面分区工具终极解决方案
  • 滨城幼儿教育管理系统(10051)
  • 机器视觉 Vs 智能体视觉(32)
  • Layer Normalization 技术解析:从原理到RNN实战
  • 炉石传说自动化脚本:如何用智能助手解放你的游戏时间
  • Windows右键菜单终极清理指南:三步高效管理冗余选项
  • 全境透视·智域重构系统技术发布会
  • Altium Designer实战指南:利用Ultra Librarian高效构建专属元件库
  • SCTransNet:空间通道交叉Transformer如何革新红外小目标检测?
  • AI智能体沙盒环境搭建指南:从原理到实战部署
  • 白细胞介素-1β(IL-1β)的结构、产生、功能及相关基因特性研究
  • 洛雪音乐-最新音源分享及配置
  • 深入解析Android Activity Manager Service (AMS):开发、优化与面试指南
  • 2026 年天津靠谱公墓服务机构推荐:合规资质 + 透明服务 + 一站式购墓指南 - 海棠依旧大
  • 别再折腾本地LaTeX环境了!用Overleaf在线编辑器5分钟搞定论文排版
  • 【Python量化实战】—— 基于Qteasy的Fama-French三因子选股策略构建与回测【附源码】
  • 原材料价格智能预警系统,落地实操与采购时机推荐:基于实在Agent Claw-Matrix的端到端自动化实践
  • 【信息科学与工程学】计算机科学与自动化———第六十四篇 内存 系列一 内存算法02
  • 中国500万医生的新AI:顶刊独家联手,卷的就是证据源
  • 扩散模型也有「Skills」了!魔搭开源11个现成模板,风格、修图、超清一键搞定
  • 微信小程序开发- 位置API 学习笔记
  • GESP考级通关秘籍:从一级到四级,这份保姆级备考路线图请收好(含真题解析)
  • 手把手教你用FANUC ROBOGUIDE搭建第一个涂胶仿真工作站(附模型导入避坑指南)
  • Docker部署SpringBoot项目(图文详解)——从零到上线保姆级教程
  • [实战] 制造业全尺寸报告(Full Dimension Report)编制规范与数字化处理流程详解
  • 制造业采购商务谈判智能助手,落地方法与授权规则设置:2026企业级智能体(Agent)实操全指南