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

【把玩数据结构】详解队列

目录

  • 队列介绍
    • 队列概念
    • 队列的结构
    • 生活中的队列
  • 队列的实现
    • 队列的初始化
    • 队列的销毁
    • 队尾入队列
    • 队头出队列
    • 获得队头元素
    • 获得队尾元素
    • 统计队列元素个数

队列介绍

队列概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列遵守先进先出FIFO(First In First Out)的原则。

入队列:队列的插入操作叫做入队列,进行插入操作的一端称为队尾。

出队列:队列的删除操作叫做出队列,进行删除操作的一端称为队头

队列的结构

生活中的队列

在生活中最常见的队列无非就是在食堂的窗口进行打饭了,总是先去排队的同学先离开队列。

队列的实现

队列的初始化

typedefintQDataType;//方便以后修改存储的数据类型typedefstructQueueNode//队列中的节点{QDataType val;structQueueNode*next;}QueueNode;typedefstructQueue{QueueNode*phead;QueueNode*ptail;intsize;//不要忘了保存数列的有效数据个数}Queu

队列底层一般是用单链表来实现,然后队列本身有队头指针和队尾指针,还有有效数据个数size组成

voidQueueInit(Queue*pq){assert(pq);pq->phead=pq->ptail=NULL;pq->size=0;}

队列的销毁

voidQueueDestroy(Queue*pq){assert(pq);while(pq->phead!=pq->ptail){QueueNode*del=pq->phead;pq->phead=pq->phead->next;free(del);del=NULL;}free(pq->phead);pq->phead=NULL;pq->ptail=NULL;//不要忘了把ptail也设置NULL,虽然他们是指向同一块空间,但是指针变量不是同一块空间pq->size=0;//不要忘了把size设置0}

这里要注意释放队尾指针,虽然最后都是指向和队头指向的同一块空间,但是指针变量的空间不一样

队尾入队列

这里入队列就要创建一个节点

QueueNode*QBuyNode(QDataType x){QueueNode*tmp=(QueueNode*)malloc(sizeof(QueueNode));if(tmp==NULL){perror("malloc failed");exit(1);}tmp->val=x;tmp->next=NULL;returntmp;}
voidQueuePush(Queue*pq,QDataType x){assert(pq);QueueNode*newnode=QBuyNode(x);//注意考虑队列为空的情况if(pq->phead==NULL)//队列为空{pq->phead=pq->ptail=newnode;}else{pq->ptail->next=newnode;pq->ptail=newnode;}pq->size++;}

注意队列为空的情况,队头和对尾是指向同一个节点

队头出队列

voidQueuePop(Queue*pq){assert(pq);assert(!QEmpty(pq));//assert为假就会触发if(pq->phead==pq->ptail)//如果队列只有一个数据,所有数据结构最好都考虑为空和只有一个数据的情况{free(pq->phead);pq->phead=pq->ptail=NULL;}else{QueueNode*del=pq->phead;pq->phead=pq->phead->next;free(del);del=NULL;}//不要搞忘了--sizepq->size--;}

注意队列只有一个数据的情况和size–。

获得队头元素

QDataTypeQueueFront(Queue*pq){assert(pq);assert(!QEmpty(pq));//assert为假会触发returnpq->ptail->val;}

获得队尾元素

QDataTypeQueueBack(Queue*pq){assert(pq);assert(!QEmpty(pq));//assert为假会触发returnpq->ptail->val;}

统计队列元素个数

intQueueSize(Queue*pq){assert(pq);returnpq->size;}
http://www.jsqmd.com/news/577878/

相关文章:

  • GKD规则冲突检测:自动化识别并提示重叠规则问题
  • 2026年国内热门殡葬用品品牌科普推荐(新手必看):寿衣选购不再踩坑 - 资讯焦点
  • ChatGPT_JCM前端构建工具对比:Webpack、Vite与Rollup
  • 终极指南:如何用danger-js在Jest测试框架中实现自动化代码审查
  • 【ROS2】雷达驱动实战:从FMCW原理到PointCloud2发布
  • ensp实战演练:用快马AI生成含隐蔽故障的网络项目,锤炼排错能力
  • 10分钟掌握 Terraform AWS EKS Blueprints 的 Karpenter 集成:实现自动节点扩展与成本优化终极指南
  • 温和溶石除味不刺激,2026除牙结石防口臭牙膏实测推荐:日常护齿必看 - 资讯焦点
  • 终极指南:Graph Nets从入门到精通 - 深度解析图神经网络消息传递机制
  • 别再乱调参数了!手把手教你用MATLAB/Simulink分析VSG多机并联的频率稳定性
  • 电子设备流水线适配z型链板提升机高性价比之选 - 资讯焦点
  • GraphQL Ruby解析器模式:10个业务逻辑分离与代码复用的终极技巧
  • TOAST UI Chart错误处理与调试终极指南:10个常见问题解决方案大全
  • Danger.js故障排除终极指南:解决10个最常见配置问题
  • 白发转黑发哪个品牌有效?黑奥秘“防白三件套”产品,白发转黑科学养发 - 美业信息观察
  • CameraKit-Android终极社区贡献指南:从新手到核心开发者的完整教程
  • Svix-webhooks实战指南:电商、金融、物联网三大场景应用案例
  • Redacted Font:企业级产品设计的终极保密字体应用指南
  • TOAST UI Chart仪表盘开发终极指南:Gauge图表在企业监控中的完整应用方案
  • 图网络梯度计算与反向传播:自动微分技术的完整指南
  • 深入解析BulletinBoard:iOS上下文卡片库的完整架构指南与核心实现
  • 如何为RTX3090显卡在Ubuntu22.04上快速搭建PyTorch2.0.1的CUDA11.7环境
  • Windows窗口置顶3分钟快速上手指南:告别频繁切换的烦恼
  • Midscene.js:当视觉AI重新定义UI自动化边界
  • C++析构函数:关键特性与应用
  • 用快马快速原型设计:一键生成可复制的稀有符号库网页
  • 函数基础(超级超级重点)
  • 0401
  • AllTube Download 10个实用技巧:从基础下载到高级格式转换
  • B站资源收藏困境终结者:BiliTools如何让你轻松拥有离线媒体库