数组实现循环队列(新增一个空间)

目录

一、前言

1.如何实现循环?

2.如何判断队列为空?

3.如何判断队列为满?

二、循环队列的结构定义

三、循环队列的创建及其初始化

四、入队

五、出队

六、取队头元素

七、取队尾元素

八、判空

九、判满

十、销毁队列


一、前言

利用数组实现循环队列,重点要解决的问题有三个:

1.如何实现循环?

由于数组大小k是确定的,要实现队列循环就需要让数组下标循环,利用两个下标front、back分别指向首元素和尾元素的下一个位置。front = (front+1) % k,back = (back+1) % k,即可完成下标的循环。

2.如何判断队列为空?

初始化时,front和back都为0,此时为空。因此我们确定判空条件为 front = back时循环队列为空。

3.如何判断队列为满?

我们发现,当队列满时,由于back指向队尾元素的下一个,因此队列满时,front = back ,与队列空时相矛盾。如何解决呢?

两种解决方法:

一是:循环队列结构中新增队列大小 size ,当size=0且front = back时,队列为空;当size≠0且front = back时,队列为满。

二是:新增一个空间,不存储数据,front = (front+1) % (k+1),back = (back+1) % (k+1),当 (back+1) % (k+1) = front时,队列为满。

本文仅讲解方法二,方法一详见:数组实现循环队列(增设队列大小size)-CSDN博客

二、循环队列的结构定义

循环队列结构中包括数组、头指针、尾指针、队列容量

//方法二
//循环队列的结构定义
typedef int MCQDataType;typedef struct {MCQDataType *a;//数组int front;//头指针,指向队头元素int back;//尾指针,指向队尾元素的下一个位置int k;//循环队列容量
} MyCircularQueue;

三、循环队列的创建及其初始化

首先动态申请一个循环队列结构体的内存空间,然后为数组动态申请k+1个内存空间,并将头指针、尾指针都初始化为0,队列容量初始化为k。

//方法二
//循环队列的创建及其初始化
MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue *mcq=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));mcq->a=(MCQDataType*)malloc(sizeof(MCQDataType)*(k+1));mcq->k=k;mcq->front=mcq->back=0;return mcq;
}

四、入队

先判断队列是否为满,不满则入队,同时尾指针要  加1模(k+1)  ,back = (back+1) % (k+1)

//方法二
//入队
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if((obj->back+1)%(obj->k+1)==obj->front)//满队列{return false;}obj->a[obj->back]=value;obj->back=(obj->back+1)%(obj->k+1);return true;
}

五、出队

先判断队列是否为空,不空则出队,同时头指针要  加1模(k+1),front = (front+1) % (k+1)

//方法二
//出队
bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(obj->front==obj->back)//空队列{return false;}obj->front=(obj->front+1)%(obj->k+1);return true;
}

六、取队头元素

先判断队列是否为空,不空则返回头指针指向的元素

//方法二
//取队头元素
int myCircularQueueFront(MyCircularQueue* obj) {if(obj->front==obj->back)//空队列{return -1;}return obj->a[obj->front];
}

七、取队尾元素

先判断队列是否为空,不空再判断尾指针的位置:

如果尾指针指向0位置,则队尾元素在数组最后一位,即k的位置(因为总共开辟了k+1个空间);

如果尾指针不指向0位置,那么队尾元素位置是back-1。

//方法二
//取队尾元素
int myCircularQueueRear(MyCircularQueue* obj) {if(obj->front==obj->back)//空队列{return -1;}if(obj->back==0){return obj->a[obj->k];//重点}else{return obj->a[obj->back-1];}
}

八、判空

判空条件是 front = back

//方法二
//判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->back==obj->front;
}

九、判满

判满条件是 (back+1)%(k+1) = front

//方法二
//判满
bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->back+1)%(obj->k+1)==obj->front;
}

十、销毁队列

动态申请的内存空间都要动态销毁free

//方法二
//销毁循环队列
void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

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

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

相关文章

【滑动窗口】LeetCode2953:统计完全子字符串

作者推荐 [二分查找]LeetCode2040:两个有序数组的第 K 小乘积 本题其它解法 【离散差分】LeetCode2953:统计完全子字符串 题目 给你一个字符串 word 和一个整数 k 。 如果 word 的一个子字符串 s 满足以下条件,我们称它是 完全字符串: s 中每个字符…

深入理解:指针变量的解引用 与 加法运算

前言 指针变量的解引用和加法运算是非常高频的考点,也是难点,因为对初学者的不友好,这就导致了各大考试都很喜欢在这里出题,通常会伴随着强制类型转换、二维数组、数组指针等一起考查大家对指针的理解。但是不要怕,也许…

论文解读--PointPillars- Fast Encoders for Object Detection from Point Clouds

PointPillars--点云目标检测的快速编码器 摘要 点云中的物体检测是许多机器人应用(如自动驾驶)的重要方面。在本文中,我们考虑将点云编码为适合下游检测流程的格式的问题。最近的文献提出了两种编码器;固定编码器往往很快,但牺牲了准确性,而…

腾讯视频崩了,年终奖没了。。。

最近互联网的瓜可是不少啊!最开始阿里云崩了,阿里云崩了之后,没几天滴滴也崩了,滴滴崩了之后,结果昨天腾讯视频也崩了......年底了,都要来刷刷存在感吗? 简直让我想起来一首儿歌: 阿…

使用autodl服务器,两个3090显卡上运行, Yi-34B-Chat-int4模型,并使用vllm优化加速,显存占用42G,速度23 words/s

1,演示视频地址 https://www.bilibili.com/video/BV1Hu4y1L7BH/ 使用autodl服务器,两个3090显卡上运行, Yi-34B-Chat-int4模型,用vllm优化,增加 --num-gpu 2,速度23 words/s 2,使用3090显卡 和…

25、矩阵乘法的本质

本来一直在介绍卷积,为什么突然出现一个矩阵乘法呢? 因为如果我们将卷积运算拆开,其中最核心的部分便是一个矩阵乘法。所以,卷积算法可以看做是带滑窗的矩阵乘法。 这里的滑窗,就是卷积运算中所示意的动图那样,所以,我们把滑窗固定,不看卷积核滑动这个动作,那么就是…

龙芯loongarch64服务器编译安装tokenizers

1、简介 Hugging Face 的 Tokenizers 库提供了一种快速和高效的方式来处理(即分词)自然语言文本,用于后续的机器学习模型训练和推理。这个库提供了各种各样的预训练分词器,如 BPE、Byte-Pair Encoding (Byte-Level BPE)、WordPiece 等,这些都是现代 NLP 模型(如 BERT、GP…

数据的标准化和归一化

前面我们已经学习了识别数据缺失值已经对缺失值进行处理的方法,但是KNN的准确率都不是很高,今天我们继续进行数据探索进一步增强机器学习流水线; 通过数据直方图可以看到数据中的列的均值、最大值、最小值等差别很大; from skle…

VT-MRPA1-151-1X/V0/0控制2FRE16模块式模拟放大器

适用于控制带有电气位置反馈的直动式比例减压阀(DBETR- 1X 类型)或带有电气位置反馈的比例流量控制阀(2FRE... 类型);控制值输入 1 0 V(差动输入); 可分别调节“上/下”斜坡时间的斜…

android 13.0 去掉usb授权提示框 默认给予权限

1.概述 在13.0的系统rom产品开发中,在进行iot关于插入usb设备的开发过程中,在插入usb设备时会弹出usb授权提示框,也带来一些不便, 这个需要默认授予USB权限,插拔usb都不弹出usb弹窗所以这要从usb授权相关管理页默认给与usb权限,接下来分析下 相关的实现功能流程 2.去掉u…

两种内网穿透的实现方法

目录 前言: 一、IP和端口的作用 二、公网IP不够用 三、内网穿透实现方法 方法一:设置路由器 方法二:使用某些APP,例如花生壳 前言: 本文会介绍为什么需要使用内网穿透以及实现内网穿透的两种方法 一、IP和端口…

Common.js 和 ES6 Module 中模块引入的区别

CommonJS和ES6 Module CommonJS是一种模块规范,最初被应用于Nodejs,成为Nodejs的模块规范。运行在浏览器端的javaScript由于也缺少类似的规范,在ES6出来之前,前端也实现了一套相同的模块规范(例如:AMD)&am…

mac磁盘管理工具 DiskCatalogMaker中文 for Mac

磁盘管理工具功能介绍 制作光盘 将您的磁盘图标拖放到目录窗口。 通过Roxio Toast Titanium自动添加刻录光盘。更多 对多张光盘使用批量扫描模式。 您也可以使用生成缩略图图像选项。 并请将其快速编目引擎与其他编目人员比较! 下载:DiskCatalogM…

【华为OD题库-064】最小传输时延I-java

题目 某通信网络中有N个网络结点,用1到N进行标识。网络通过一个有向无环图.表示,其中图的边的值表示结点之间的消息传递时延。 现给定相连节点之间的时延列表times[]{u,v, w),其中u表示源结点,v表示目的结点&#xff0…

CSS-2

结构伪类选择器 作用:根据元素的结构关系查找元素 本例中以 p 标签 查找第一个 p 标签元素 p:first-child{background-color:red; }查找最后一个 p 标签元素 p:last-child{background-color:green; }查找第 666 个 p 标签元素 p:nth-child(666){background-co…

【Linux20.04-qt5.12.4软件安装与初步使用-qt在Linux使用-记录-笔记】

【Linux-qt软件安装与初步使用-qt在Linux使用-记录-笔记】 1、概述2、环境说明3、步骤总结1、了解并选择自己想要安装的版本2、访问 Qt 官方网站3、在 Qt 网站上找到下载部分(自己想下载)4、下载完成后,给安装程序文件赋予执行权限。5、自动配…

PTA 7-238 整数转换为字符串

将一个整数n转换成字符串。例如;输入483,应得到字符串"483"。其中,要求用一个递归函数实现把一个正整数转换为字符串。 输入格式: 首先输入测试组数T,然后输入T组测试数据。每组测试数据输入一个整数n(−231≤n≤231−…

关于svn如何上传一个完整的项目

注意:请一定要按照该步骤进行操作,请上传新项目时将项目名称进行规范命名 例如原始文件是arrange_v2 将此项目需要注入新的医院 则命名为 arrange_某医院名称_门诊或者医技或者药房_v2 重新命名文件夹名称快捷键 (F12) 一 &…

详解卷积神经网络(Convolutional Neural Networks, CNNs)

全连接神经网络基础 全连接神经网络(Fully Connected Neural Network 或 Multi-Layer Perceptron, MLP)是最简单的深度学习模型之一。一个典型的全连接网络由多个层组成,每一层包含多个神经元或节点。每个神经元与上一层的所有神经元相连&am…