【数据结构】队列——循环队列(详解)

目录

0  循环队列

1  特定条件下循环队列队/空队满判断条件

1.1 队列为空的条件

1.2 队列为满的条件

2  循环队列的实现

3  示例

4  注意事项


0  循环队列

        循环队列(Circular Queue)是队列的一种实现方式,它通过将队列存储空间的最后一个位置与第一个位置相连接,形成一个循环的队列结构,从而可以更加高效地利用存储空间。在循环队列中,当队尾指针到达队列存储空间的末尾时,下一个插入操作将从头开始,即实现了队列的“循环”。

1  特定条件下循环队列队/空队满判断条件

        在循环队列中,判断队列是否为空或已满是一个重要的操作。由于循环队列的特性,我们不能简单地通过比较队头指针(front)和队尾指针(rear)是否相等来判断队列是否为空或已满,因为当队列为空时和当队列满时,这两个指针都可能相等。

1.1 队列为空的条件

        队列为空的条件相对简单,即队头指针和队尾指针相等:

front == rear

1.2 队列为满的条件

        队列为满的条件需要特殊处理,因为当队列满时,队尾指针的下一个位置应该是队头指针。但是,我们不能直接比较 rear + 1 和 front 是否相等,因为 rear + 1 可能会超出数组索引的范围。因此,我们需要使用模运算 % 来确保索引在数组范围内循环。

        有两种常见的实现方式:

        ①浪费一个空间
        在这种方法中,我们故意让队列中始终保持一个空闲位置,这样当 rear 的下一个位置是 front 时,队列就是满的。

(Q.rear + 1) % MAX_SIZE == Q.front

        这种方法的好处是实现简单,缺点是浪费了一个空间。

        ②使用额外的变量
        我们可以使用一个额外的变量(例如 size 或 count)来跟踪队列中元素的数量。当 size 等于 MAX_SIZE 时,队列就是满的。

size == MAX_SIZE

        这种方法需要额外的空间来存储元素数量,但是空间利用率更高,没有浪费。

        下面循环队列的实现将采用第一种方法。

2  循环队列的实现

        循环队列通常使用一个固定大小的数组来实现,同时需要两个指针来指示队头和队尾的位置。为了区分队列是满还是空,我们可以使用以下几种方法之一:

  1. 设置一个标记变量:当队列为空时,该变量为某个特定值(如 false);当队列满时,该变量为另一个特定值(如 true)。
  2. 使用队尾指针的下一个位置:当队尾指针的下一个位置等于队头指针时,队列满;当队头指针等于队尾指针时,队列空(但需要注意区分队列空和队列满时队头队尾指针重合的情况)。

        循环队列实现:

#include <stdio.h>  
#include <stdlib.h>  
#include <stdbool.h>  #define MAX_SIZE 100  typedef struct {  int data[MAX_SIZE];  int front; // 队头指针  int rear;  // 队尾指针  
} CircularQueue;  // 初始化循环队列  
void initQueue(CircularQueue *Q) {  Q.front = Q.rear = 0;  
}  // 判断队列是否为空  
bool isEmpty(CircularQueue *Q) {  if(Q.front==Q.rear)return true;elsereturn false;
} // 判断队列是否已满  
bool isFull(CircularQueue *Q) {  if((Q.rear + 1) % MAX_SIZE == Q.front)return false;
}  // 入队操作  
bool enqueue(CircularQueue *Q, int x) {  if (isFull(Q)) {  printf("Queue is full\n");  return false;  }  Q.data[Q.rear] = x;  Q.rear = (Q.rear + 1) % MAX_SIZE;  return true;  
}  // 出队操作  
bool dequeue(CircularQueue *Q, int &x) {  if (isEmpty(Q)) {  printf("Queue is empty\n");  return false;  }  x = Q.data[Q.front];  Q.front = (Q.front + 1) % MAX_SIZE;  return true;  
}  int main() {  CircularQueue Q;  initQueue(&Q);  // 入队操作  enqueue(&Q, 1);  enqueue(&Q, 2);  enqueue(&Q, 3);  // 出队操作  int x;  dequeue(&Q, &x);  printf("Dequeued: %d\n", x); // 输出 1  // ... 其他操作 ...  return 0;  
}

3  详解队空/队满的判定

        例如:一个队列的入队顺序为 a,b,c,d,e :

        ①空队;

        ②a,b,c入队;

        ③不舍弃条件下;

        ④牺牲一个单元条件下。

        综上,在牺牲一个单元下,可以正确的判定该队列是队空还是队满。

4  注意事项

  • 当队尾指针 rear 到达数组的末尾时,需要将其回绕到数组的开头,这通常通过取模运算 % MAX_SIZE 来实现。
  • 类似地,当队头指针 front 向前移动并到达数组的开头时,也需要将其回绕到数组的末尾(尽管在出队操作中不直接需要,但在某些情况下,如查找队中某个元素时可能会用到)。
  • 在判断队列是否已满时,注意区分队列满和队列空时队头队尾指针重合的情况。在循环队列中,当队尾指针的下一个位置等于队头指针时,队列满。因此,我们使用 (Q.rear + 1) % MAX_SIZE == Q.front 来判断队列是否已满。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL之多表查询—行子查询

一、引言 上篇博客学习了列子查询。 接下来学习子查询中的第三种——行子查询。 行子查询 1、概念 子查询返回的结果是一行&#xff08;当然可以是多列)&#xff0c;这种子查询称为行子查询。 2、常用的操作符 、 <> (不等于) 、IN 、NOT IN 接下来通过一个需求去演示和…

locale本地化库学习

std::locale 类型的对象&#xff08;本地环境对象&#xff09;是不可变刻面的一个不可变索引集。C 输入/输出库的每个流对象都与一个 std::locale 对象关联&#xff0c;并用它的各刻面来分析及格式化所有数据。另外&#xff0c;每个 std::basic_regex 对象也都与一个本地环境对…

Linux下软件安装

提示&#xff1a;制作不易&#xff0c;可以点个关注和收藏哦。 前言 介绍 Ubuntu 下软件安装的几种方式&#xff0c;及 apt&#xff0c;dpkg 工具的使用。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考. 一、先体验一下 比如我们想安装一个软件&…

Diffusers代码学习: 多个Adapter

T2I Adapter也是可组合的&#xff0c;允许您使用多个适配器对图像施加多个控制条件。例如&#xff0c;可以使用姿势贴图提供结构控制&#xff0c;使用深度贴图进行深度控制。这是由[MultiAdapter]类启用的。 让我们用姿势和深度适配器来调节文本到图像的模型。创建深度和姿势图…

IT闲谈-Kylin入门教程

目录 一、引言二、Kylin简介三、环境准备四、安装与配置五、数据导入与建模六、查询与分析七、总结 一、引言 Apache Kylin是一个开源的分布式分析引擎&#xff0c;旨在提供Hadoop/Spark之上的SQL接口及多维分析&#xff08;OLAP&#xff09;能力以支持超大规模数据。Kylin通过…

TinyVision V851s 使用 OpenCV + NPU 实现 Mobilenet v2 目标分类识别

用39块钱的V851se视觉开发板做了个小相机。 可以进行物品识别、自动追焦&#xff01; 这个超低成本的小相机是在V851se上移植使用全志在线开源版本的Tina Linux与OpenCV框架开启摄像头拍照捕获视频&#xff0c;并结合NPU实现Mobilenet v2目标分类识别以及运动追踪等功能......并…

以无厚,入有间,做一件事为什么靠努力不行,不能长期维持

庖丁解牛&#xff0c;并不是在说人和技巧&#xff0c;而是在说解牛不在于刀的锋利&#xff0c;而是怎样才能做到让刀不产生损耗&#xff0c;就是熟悉牛肉纹路&#xff0c;按照纹路和肉骨间隙进行操刀。这就是尊重自然规律&#xff0c;对于人也是一样的&#xff0c;如果所有事情…

C++输入输出与IO流

C 输入输出与I/O流 文章目录 C 输入输出与I/O流IO类型与基础特性概念与特性IO状态输出缓冲区 文件输入输出文件模式 string流IO处理中常用的函数及操作符综合练习与demo一、 创建文件并写入二、控制台输入数据并拆分存储三、读写电话簿 IO类型与基础特性 C11标准提供了几种IO处…

android 抓取 logcat 日志的方法

1.找到这个路径 2.然后执行命令&#xff08;adb logcat -v time >.\\logcat.log&#xff09;&#xff0c;开始抓取日志 3.这个时候就可以去操作APP了&#xff0c;复现BUG了。 Ctrlc 结束日志抓取 adb logcat -c 清空旧日志

逆市创新高!水电“双雄“是怎样炼成的? 博通,赢麻了!

高分红夏季用电高峰AI的尽头是电力 6月7日&#xff0c;长江电力&#xff08;600900&#xff09;、华能水电&#xff08;600025&#xff09;股价双双上涨。截至收盘&#xff0c;长江电力股价上涨1%&#xff0c;收于28.31元/股&#xff1b;华能水电股价上涨1.52%&#xff0c;收于…

Matlab|遗传粒子群-混沌粒子群-基本粒子群

目录 1 主要内容 2 部分代码 3 效果图 4 下载链接 1 主要内容 很多同学在发文章时候最犯愁的就是创新点创新点创新点&#xff08;重要的事情说三遍&#xff09;&#xff0c;对于采用智能算法的模型&#xff0c;可以采用算法改进的方式来达到提高整个文章创新水平的目的&…

基于STM32开发的智能机器人导航系统

目录 引言环境准备智能机器人导航系统基础代码实现&#xff1a;实现智能机器人导航系统 4.1 距离传感器数据读取4.2 电机控制4.3 实时路径规划与避障4.4 用户界面与状态显示应用场景&#xff1a;智能机器人导航与控制问题解决方案与优化收尾与总结 1. 引言 智能机器人导航系…

中国西部AI创新港,数字经济的新引擎

编辑&#xff1a;阿冒 设计&#xff1a;沐由 时间&#xff1a;2024年5月31日。 地点&#xff1a;西安交通大学创新港校区涵英楼千人报告厅。 人物&#xff1a;近千位政府、高校和企事业单位的代表&#xff0c;还有我。 我们的脚下&#xff0c;就是八百里秦川。 三秦自古多才俊。…

Linux基础指令(一)

前言 Linux基础指令主要学习&#xff1a;对目录、文件、压缩包、匹配查找&#xff0c;权限等操作 第一次接触ubuntu需要知道的基本知识 sudo passwd root 先给root用户设置密码 su root 切换到root用户 su zhangsan …

Django里的Form组件

Form组件提供 自动生成HTML标签和半自动读取关联数据 (“半自动”是指还得需要自己手写输入数据进来)表单验证和错误提示 要想创建并使用该组件&#xff0c;操作步骤如下&#xff1a; 在 views.py 里创建类 # 在 views.py 文件里from django import formsclass AssetForm(fo…

core dump核心转储

检查核心转储是否开启&#xff0c;否则无法生成core文件 ulimit -a 如果为0就需要修改 ulimit -c 10240 写一个会触发core命令的程序 以浮点数运算为例 #include <iostream>int main() {int i 1/0; } 在编译时使用-g选项 运行程序&#xff0c;生成core文件 gdb调试 g…

C++ MPI多进程并发

下载 用法 mpiexec -n 8 $PROCESS_COUNT x64\Debug\$TARGET.exe 多进程并发启动 mpiexec -f hosts.txt -n 3 $PROCESS_COUNT x64\Debug\$TARGET.exe 联机并发进程&#xff0c;其它联机电脑需在相同路径下有所有程序 //hosts.txt 192.168.86.16 192.168.86.123 192.168…

MySQL-备份(三)

备份作用&#xff1a;保证数据的安全和完整。 一 备份类别 类别物理备份 xtrabackup逻辑备份mysqldump对象数据库物理文件数据库对象&#xff08;如用户、表、存储过程等&#xff09;可移植性差&#xff0c;不能恢复到不同版本mysql对象级备份&#xff0c;可移植性强占用空间占…

java中集合List,Set,Queue,Map

Java SE中的集合框架是一组用于存储和操作对象的类和接口。它提供了丰富的数据结构&#xff0c;可以用于解决各种问题。Java SE中的集合框架包含以下主要类和接口&#xff1a; 一. Collection接口&#xff1a; 是集合框架的根接口&#xff0c;它定义了一些通用的集合操作方法…

【Modelground】个人AI产品MVP迭代平台(4)——Mediapipe视频处理网站介绍

文章目录 介绍模型配置输入输出核心实现&#xff08;源码&#xff09;总结 介绍 这篇文章我将硬核介绍Modelground的第一个产品——Mediapipe视频处理&#xff01;网站入口为https://tryiscool.space/ml-video/&#xff0c;如图所示&#xff0c;欢迎体验。 tip: 由于服务器带宽…