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

队列基础概念

文章目录

  • 🍊自我介绍
  • 🍊现实生活中的例子
  • 🍊队列的介绍
  • 🍊循环队列
  • 🍊小结


你的点赞评论就是对博主最大的鼓励
当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~


🍊自我介绍

  Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”“内容共创官” ,现在我来为大家介绍一下有关物联网-嵌入式方面的内容。


🍊现实生活中的例子

  当我们拨打联通、移动客服电话的时候,客服人员与客户相比总是在少数,在所有客服人员都占线的情况下,客户被要求等待,直到有某个客服人员空下来,才能让最先等待的客户接通电话。也就是说我们这里将所有打电话的客户进行了排队的操作。还有,过年的时候火车票非常的难买,一般去买火车站买票的时候,对会排着长长的队伍。这些都是我们常见的排队。我们数据结构中的队列,就是类似的结构。

🍊队列的介绍

概述
  队列是一种先进先出(First In Fisr Out)的线性表,简称FIFO,允许在一端进行插入操作的叫做队尾,允许删除的一端称为队头
  假如队列的元素为a1,a2…an,那么如下图所示,a1就是队头元素an就是队尾元素。就像我们排队走地下通道,第一个进入的人肯定是第一个出来的人,这个就是我们所说的先进先出,如下图所示:
在这里插入图片描述
队列存储的问题
  按照我们之前的学习规律,我们应该会学习队列的顺序存储和队列的链式存储。,下面我们先来看看队列的顺序存储。由于我们不知道究竟队列究竟存储多少个元素,因此我们一般定义一个比较大的数组来存储我们的数据。假如我们的一个队列有n个元素,一般下标为0的一般我们叫做队头,所谓的入队操作,就是在数组最后一个元素后,在追加一个新的元素。前面的元素不需要移动。如下图:
在这里插入图片描述
  而根据我们队列的定义,我们队列的出队操作都是在队头,也就是在下标为0的位置出队。那也就是说,我们队列后面的元素相对来说都需要向前移动,以保持我们下标为0位置不为空。如下图所示:
在这里插入图片描述
  这样对于我们来说是不是效率太低呢?若是我们把队头设置为可移动的,也就是说队头不需要一定在下标为0的位置,这样我们的效率不是大大的提高了吗?如下图:
在这里插入图片描述
 &emspo既然我们的数据是尾入头出,那么我们就来定义两个变量来表示头和尾,一个叫做front表示我们的队头元素的下标,一个叫做rear表示我们队尾元素的下一个元素下标。
 &emspo提问:为什么要rear要指向我们的队尾元素的下一个元素的下标,而不是直接指向我们的队尾元素的下标呢?
答案:表示队尾元素的下一个元素下标方便我们队空的操作。
我们看一下如果把rear指向最后一个元素的情况:
在这里插入图片描述
我们再看一下rear指向队尾元素下一个坐标的情况以及判空情况

在这里插入图片描述
顺序存储的问题

 &emspo;假设长度是有int a[5]的数组,刚开始里面没有存放任何元素指向下标为0 的位置。
在这里插入图片描述
 &emspoa1,a2,a3,a4开始入队,front依旧指向了0,rear则指向了4的位置。
在这里插入图片描述
 &emspo出队a1,a2,则front指向下表为2的位置,rear不变。如下左图所示,然后再入队a5,此时front位置不变,rear的位置移动数组之外。我们看看是不是越界了?我们数组中只有3个元素竟然越界了???

在这里插入图片描述
 &emsp这种现象叫做假溢出,但是,我们前面的0和1的位置是空的!为什么不让他们放到0和1的位置呢?
 &emspo这个就是我们下面要说的循环队列的思想。

🍊循环队列

概述
 &emsp<>b队列的这种首尾相连的顺序存储结构称之为循环队列。
操作
 &emsp若是我们允许当数组后面的数据满了的时候,我们允许rear把数据塞到我们下标为0的状态,就如下图:
在这里插入图片描述
若是我们再入队a7的话,我们的rear和front不就重合了吗?如下图:
在这里插入图片描述
  这种情况我们发现是rear = front,但是我们的队列是满的不是空的,这跟我们前面说的队列空的情况有冲突,那么该如何解决呢?
解决方法:
1、设置一个标志位以区分队列空还是满(用的很少
2、我们修改队列满的条件,保留一个元素的空间。也就是说,队列满的时候,我们是数组中还有一个空闲的单位!如下图:
在这里插入图片描述
队满的条件是“队列front指向了队尾rear的下一个位置上
我们判断队列满的条件是:

front = (rear+1) % MAX
MAX是队列的长度

  之所以不是front = rear +1,请看下图
在这里插入图片描述
如果front = rear+1的话,我们可以清楚地看到4+1=5,而不是等于0.

同样的情况我们可以得到front和rear的更新方法:

front更新数据的方法:front = (front) % 5;
rear更新数据的方法:rear = (rear) % 5;

🍊小结

队列空的判定条件:
front == rear队列满的判定条件:
front = (rear+1) % MAX //MAX是队列的长度front更新数据的方法:front = (front) % 5;
rear更新数据的方法:rear = (rear) % 5;

http://www.mrgr.cn/news/31446.html

相关文章:

  • 基于机器学习的癌症数据分析与预测系统实现,有三种算法,bootstrap前端+flask
  • 【读书笔记-《30天自制操作系统》-23】Day24
  • 每天五分钟计算机视觉:将人脸识别问题转换为二分类问题
  • 完美转发、C++11中与线程相关的std::ref
  • IDEA配置全局的maven环境
  • 《深度解析 C++中的拷贝构造函数:概念、作用与实践》
  • Vue学习记录之六(组件实战及BEM框架了解)
  • 渐变色代码主题你受得了吗
  • 固执和坚持99%的人不作区分
  • C++_CH18_构造函数与析构函数
  • 【宠粉赠书】大模型RAG实战:RAG原理、应用与系统构建
  • 每日奇难怪题(持续更新)
  • 360手机黑科技“位置穿越”功能修复 360位置穿越使用
  • 7个提升网站分页体验的 CSS 和 JavaScript 代码片段
  • 双token无感刷新
  • Python 类的继承
  • Generative Models from the perspective of Continual Learning【小白读论文】
  • 如何使用Spring Cloud Gateway搭建网关系统
  • 关于组织参加“2025第十四届国际生物发酵产品与技术装备展览会(济南)”的通知
  • Docker学习