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

【初阶数据结构】深入解析队列:探索底层逻辑

请添加图片描述

初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油!
时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑
深入解析队列:探索底层逻辑深入解析循环队列:探索底层逻辑

🔥引言

本篇将深入解析队列:探索底层逻辑,理解底层是如何实现并了解该接口实现的优缺点,以便于我们在编写程序灵活地使用该数据结构。

请添加图片描述
Alt

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记
🌈初阶数据结构笔记专栏: 初阶数据结构笔记

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
请添加图片描述

文章目录

  • 一、队列的概念及结构
  • 二、实现队列的相关接口(Stack.h)
    • 2.1 队列初始化
    • 2.2 队尾入队列
    • 2.3 队头出队列
    • 2.4 获得队列头部元素
    • 2.5 获得队列尾部元素
    • 2.6 获取队列中有效元素个数
    • 2.7 检测队列是否为空
    • 2.8 打印队列数据
    • 2.9 队列的销毁
  • 三、循环队列

一、队列的概念及结构

队列是指只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列具有先进先出 FIFO(First In First Out) 这一点跟栈的先进后出是相反的

  • 入队列:进行插入操作的一端并且称为队尾

  • 出队列:进行删除操作的一端并且称为队头

队列可用通过数组或链表结构实现,一般推荐使用链表实现更优一点。如果使用数组实现在出队列时,需要挪移大量数据,效率较低

这里采用链表结构实现队列

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/在这里插入图片描述

在这里插入图片描述

在设计队列结构中,需要设计两个指针去控制队列各节点的情况。head(队头指针)指向实际对头元素,taill(队尾指针),指向实际队尾元素,增加一个变量size用于统计元素个数,由于存在多种信息,可以使用结构体统一管理

在这里插入图片描述

二、实现队列的相关接口(Stack.h)

在这里插入图片描述

2.1 队列初始化

void QueueInit(Queue *pq)//所以导致了需要初始化
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}

这里需要注意的是:这里不需要对于节点进行初始化,在创建节点时会完成对应的初始化工作。

2.2 队尾入队列

void QueuePush(Queue* pq, QDataType x)
{assert(pq);Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));if (newnode == NULL){perror("malloc fail!!!");return ;}//创建为需要初始化下newnode->next = NULL;newnode->val = x;if (pq->phead == NULL)pq->phead = pq->ptail = newnode;else{(pq->ptail)->next = newnode;pq->ptail = newnode;}pq->size++;
}

这里需要注意的是:首先就是空间开辟失败,然后需要搞清楚我们申请空间是给谁使用的,这里是为节点开辟空间。而不是为Queue结构体对象开辟空间,这里节点之间连接是通过节点指针进行连接

2.3 队头出队列

void QueuePop(Queue* pq)
{assert(pq && pq->phead);Qnode *del = pq->phead;pq->phead = pq->phead->next;free(del);del == NULL;if (pq->phead == NULL){pq->ptail = NULL;}pq->size--;
}

这里需要注意的是:当队列为空时,意味着头指针为空,那么尾指针也需要置成空

2.4 获得队列头部元素

QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}

2.5 获得队列尾部元素

QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->phead);return pq->ptail->val;
}

2.6 获取队列中有效元素个数

int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}

2.7 检测队列是否为空

bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}

2.8 打印队列数据

void QueuePrint(Queue* pq)
{assert(pq);while (!QueueEmpty(pq)){printf("%d->", QueueFront(pq));QueuePop(pq);}
}

这里需要注意的是:这里不能用cur,因为cur是不会动的,phead在pop的时候一直移动

2.9 队列的销毁

void QueueDestroy(Queue* pq)
{assert(pq);Qnode* cur = pq->phead;while (cur)//删除的作用{Qnode* next = cur->next;free(cur);cur = next;}pq->ptail = NULL; pq->phead = NULL;pq->size = 0;
}

这里需要注意的是:这里cur不要手动置空,会跳出循环,需等待cur自动指向空

三、循环队列

实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型 时可以就会使用循环队列。环形队列可以使用数组实现,也可以使用循环链表实现。(会单独一篇来讲述)

在这里插入图片描述


请添加图片描述

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二初阶数据结构笔记,希望对你在学习初阶数据结构中有所帮助!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 3Python的Pandas:数据选取
  • React 19 竞态问题解决
  • 从入门到精通:网络基础详解
  • 在Pycharm中把jupyter notebook转换成md格式
  • java入门-java方法实现+案例
  • 软件架构之计算机网络
  • 【鸿蒙学习笔记】使用动画
  • Vue3框架搭建:vue+vite+pina+typescript
  • C++ Qt 自制开源科学计算器
  • 2023.2版IDEA复制配置修改端口增加一个当前运行服务的操作流程
  • cv::Mat 操作多维矩阵的思路
  • 快速响应需求:App路由动态化探索
  • 2024 年第十四届亚太数学建模竞赛(中文赛项)浅析
  • 【深度学习实战(44)】Anchor based and Anchor free(无锚VS有锚)
  • 鸿蒙笔记导航栏,路由,还有axios
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 78. Subsets
  • CSS 提示工具(Tooltip)
  • PermissionScope Swift4 兼容问题
  • 阿里云购买磁盘后挂载
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 前端面试总结(at, md)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 用 Swift 编写面向协议的视图
  • postgresql行列转换函数
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​如何使用QGIS制作三维建筑
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # Kafka_深入探秘者(2):kafka 生产者
  • # 透过事物看本质的能力怎么培养?
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (算法)求1到1亿间的质数或素数
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET 8 跨平台高性能边缘采集网关
  • .net 按比例显示图片的缩略图
  • .net 获取某一天 在当月是 第几周 函数
  • .Net 应用中使用dot trace进行性能诊断
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET学习全景图
  • .net知识和学习方法系列(二十一)CLR-枚举
  • @ComponentScan比较
  • @synthesize和@dynamic分别有什么作用?
  • [ 转载 ] SharePoint 资料
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [CF494C]Helping People
  • [CISCN2019 华东北赛区]Web2
  • [CSS] 点击事件触发的动画
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误