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

第4章栈和队列:顺序队——基本结构

4.6 顺序队

队列有两种存储结构,一种是顺序存储结构,另外一种是链式存储结构。

4.6.1 顺序队的结构

队列中数据元素的逻辑关系呈线性关系,所以队列可以像线性表、栈那样,采用顺序存储结构进行存储,即分配一块连续的存储空间来存放队列中的元素。又因为队列有队头和队尾,元素从队尾入队,从队头出队(先进后出),为了让此操作在 O(1)O(1)O(1) 时间复杂度上完成,因此,还要附设两个整型变量 frontrear 分别指示队头元素和队尾元素(分别称为“队头指针”和“队尾指针”)。

所以,用顺序存储结构表示队列,参考 4.2.1 顺序栈的存储结构以及上述引入的队头指针和队尾指针,可知队列的顺序存储结构应该包括:

  1. base:一个指向所分配连续内存空间起始地址的指针。它定义了队列的“物理边界”,是整个队列存在的基石。所有队列元素都存储在从 base 开始的一段地址连续的空间中。
  2. front:队头指针。它的核心语义是指向队列中第一个实际存在的元素(即最早入队、即将被出队的元素)。在非空队列中,base[front] 就是队头元素。
  3. rear:队尾指针。它的核心语义通常是指向队列中最后一个实际存在元素的下一个位置(即下一个新元素入队时应存放的位置)。这是一种非常普遍和高效的约定,因为它简化了入队操作。

这三个元素共同构成了顺序队的完整状态描述符。通过 base 可以定位到存储空间,通过 frontrear 可以确定当前队列中有效数据在存储空间中的范围。

//队列的顺序存储结构
#define MAXQSIZE 100 //队列可能达到的最大长度typedef struct{QElemType *base; //存储空间的基地址int front; //队头指针int rear;  //队尾指针
}SqQueue;

像这样,采用顺序存储结构的队列称为顺序队(Sequential Queue)。顺序队和之前学习过的顺序栈,都是逻辑线性关系在物理线性结构上的表示。

如图 4.6.1 所示,图中(a)表示的初始化创建了一个空队列(此队列的 MAXQSIZE=6),此时队头指针和队尾指针都指向编号为 0 的存储单元,即:初始化创建空队列时,令 front = rear = 0

当有元素入队,即从队尾插入新的元素时,该元素插入到队尾指针 rear 所指的位置(编号为 0 的存储单元),而后队尾指针 rear1 ,指向下一个新元素入队时应存放的位置,如图 4.6.1(b) 所示。

当有元素出队,即从队头删除队头元素时,从当前顺序队中删除队头指针 front 所指示的元素,并将 front1 ,从而此指针继续指向队头元素的位置,如图 4.6.1© 所示。所以,在非空队列中,队头指针(front)始终指向队头元素,而队尾指针(rear)始终指向队尾元素的下一个位置(即下一个新元素入队应该存放的位置)。

在这里插入图片描述

图 4.6.1 队列的操作

按照上述操作,在图 4.6.1 所示顺序队中,相继有元素 J4, J5, J6J_4,~J_5,~J_6J4, J5, J6 入队,再执行 J3, J4J_3,~J_4J3, J4 出队,则得到图 4.6.1(d) 所示的结果。此时队尾指针已经指向了队列可能达到的最大值 MAXQSIZE = 6 ,此状态称为“队满”。根据上述操作,可总结:

  • 入队操作:先将元素放在队尾指针所指示的位置,然后将队尾指针 rear 增 1 。

  • 出队操作:先取出队头指针所指示位置的元素,然后将队头指针 front 增 1 。

  • 队空的条件:front == rear

  • 队满的条件:rear == MAXQSIZE

    (注:MAXQSIZE 是队列存储空间的最大值,如果用数组表示,则有效索引范围为 0 到 MAXQSIZE-1。当最后一个元素存入 Q.base[MAXQSIZE-1] 后,Q.rear 会移动到 MAXQSIZE,此时队列已满。 )

http://www.dtcms.com/a/348034.html

相关文章:

  • Java 基础学习总结(211)—— Apache Commons ValidationUtils:让参数校验从 “体力活“ 变 “优雅事“
  • Vue状态管理工具pinia的使用以及Vue组件通讯
  • 一个byte表示多个bool属性的功能
  • 高并发AI服务部署方案:vLLM、TGI、FastChat性能压测报告
  • CSS 进阶用法
  • Read View是实现MVCC的三大前提之一,那么它是在什么时候建立的
  • frida安装配置及其使用方法
  • 一个奇怪的问题-Python会替代Java吗?技术语言之争的真相-优雅草卓伊凡
  • Java 大视界 -- Java 大数据在智能交通智能公交系统中的乘客流量预测与车辆调度优化
  • 程序里的依赖和中间件的依赖冲突,怎么解决
  • Docling:一个基于AI驱动的免费文档解析工具
  • Python性能优化实战(二):让循环跑得比博尔特还快
  • [身份验证脚手架] 应用布局如何构建
  • 初学python的我开始Leetcode题-16
  • CTFshow系列——命令执行web49-52
  • assert使用方法
  • Redis 高可用开发指南
  • 力扣594:最和谐子序列
  • 客流特征识别误报率↓76%!陌讯多模态时序融合算法在智慧零售的实战解析
  • Tesla智能座舱域控制器(MCU)的系统化梳理
  • 【网络运维】Shell 脚本编程:if 条件语句
  • 【40页PPT】数字工厂一体化运营管控平台解决方案(附下载方式)
  • Spark04-MLib library01-机器学习的介绍
  • SNMP 协议的总结
  • 每日算法题【链表】:相交链表、环形链表、环形链表II
  • 鸿蒙分布式计算实战:用 ArkTS+Worker 池落地可运行任务管理 Demo,从单设备到跨设备全方案
  • [二维前缀和]1277. 统计全为 1 的正方形子矩阵
  • HarmonyOS实战(DevEco AI篇)—深度体验DevEco CodeGenie智能编程助手
  • Function + 枚举 + Map:轻量路由器的最佳实践
  • ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘192.168.24.96‘ (10060)