队列OJ--循环队列

目录

题目链接:622. 设计循环队列 - 力扣(LeetCode)​​​​​

题解:

​编辑

代码实现:

完整代码:


题目链接:622. 设计循环队列 - 力扣(LeetCode)​​​​​


题解:

        循环队列的意思就是,如果将插入的数据删除后,原来的空间可以重复使用。

        我们能想到的就是利用数组或者链表这两种数据结构。

        如果使用数组的话那么数组到尾之后,要将下标置为0。

        如果使用链表的话,那么可能就要用到双向链表,当到达尾部的时候,就要重新回到头。但每次插入新的数据的时候,都要malloc新的节点,无疑增大了工作量,似乎会更复杂一些。

        本题我们就使用数组来实现:数组到尾之后,要将下标置为0,然后开始新一轮的循环。

        这时我们就遇到两个问题了,什么时候为空?什么时候为满?

        为空的情况我们是很容易想到的,此时我们定义两个指针,front(控制出队)和back(控制入队),如果front等于back那我们就认为数据为空。

        那空我们解决了,那什么情况又为满呢?

        当back到达尾部时,下标重置,此时front==back,此时可以为满?这样的话,back==front既是空,又是满,这样两种情况就区分不开了。

        这里有两种方法:1.增加一个size,size==0为空,非为插入数据总数就是满。

                                     2.增加一个控制位。

        这里我们就选择第二种方法来实现,增加一个控制位。这个位置也是存放数据的,循环起来空的是任意位置,如果插入4个数据,我们就开5个数据大小的空间。

        我们让back永远指向数据的下一个位置,back位置就不存数据。

        这样一来,如果back的下一个是front,那就代表数据存满了。

        随之也会出现下面两种情况,右边的这种情况real+1==front就能判断存满了。那左边这个back+1他就不能判断了,还会造成假越界的问题。这时我们就可以让back+1模上一个k

+1,表达式就可以写成:(back+1)%(k+1)==front。左边back值为4,这时(4+1)%(4+1)==0成立。右边(1+1)%(4+1)==2成立。这样一来问题就解决了。


代码实现:

1.结构体成员介绍:

typedef struct {int*a ;int front;int back;int k;
} MyCircularQueue;

        a为开辟的数组,k为入队数据个数  。

2.初始化

MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue*obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a = (int*)malloc(sizeof(int)*(k+1));obj->front = 0;obj->back = 0;obj->k = k;return obj;
}

3.判空和判满

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front == obj->back;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->back+1)%(obj->k+1) == obj->front;
}

        实现下面接口要用到这两个函数,我们可以将之挪到前面,也可以在上面单独声明。

4.入队

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))return false;obj->a[obj->back]=value;++obj->back;(obj->back) %=(obj->k+1);return true;
}

        入队需要注意:首先要判满,然后插入数据,最后还要考虑如果back下标如果到尾,还要将back重置为0,这里我们也可以用到取模的方法,back小于k+1back值不变back=k+1 back=k+1,back重置为0。

5.出队

bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;++obj->front;obj->front %=(obj->k+1);return true;
}

        出队需要注意:首先要判空,然后删除数据,和back一样也要检出front下标是否到尾。

6.取队头数据

int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj->a[obj->front];
}

        取队头数据,先要判空,如果为空,根据题目要求要返回-1,否则返回队头数据。

7.取队尾数据

int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj->a[(obj->back-1+obj->k+1)%(obj->k+1)];
}

         取队尾数据  ,先要判空,如果为空,根据题目要求要返回-1,否则返回队尾数据。

        如果遇到这种情况:back-1=-1,这就取不到队尾数据了。这时(obj->back-1+obj->k+1)%(obj->k+1)我们可以这样写,加上一个(k+1),就可以解决back为0 的情况了。如果back不为0,那么模上一个(k+1)就能把加上的(k+1)模掉。

8.free

void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

完整代码:

typedef struct {int*a ;int front;int back;int k;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue*obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a = (int*)malloc(sizeof(int)*(k+1));obj->front = 0;obj->back = 0;obj->k = k;return obj;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front == obj->back;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->back+1)%(obj->k+1) == obj->front;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))return false;obj->a[obj->back]=value;++obj->back;(obj->back) %=(obj->k+1);return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;++obj->front;obj->front %=(obj->k+1);return true;
}int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj->a[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj->a[(obj->back+obj->k)%(obj->k+1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

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

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

相关文章

jenkins传参给robotframework

在做自动化的时候,需要使用jenkins传参给rf,rf根据传来的变量运行,在将变量传递给py脚本文件。特此记录。 一、配置jenkins 构建的命令使用如下格式即可(注意空格): cd D:\xxx\test call pybot --variabl…

砖家测评:腾讯云标准型S5服务器和s6性能差异和租用价格

腾讯云服务器CVM标准型S5和S6有什么区别?都是标准型云服务器,标准型S5是次新一代云服务器规格,标准型S6是最新一代的云服务器,S6实例的CPU处理器主频性能要高于S5实例,同CPU内存配置下的标准型S6实例要比S5实例性能更好…

视频剪辑技巧:批量剪辑新篇章,AI智剪来领航

随着数字媒体的飞速发展,视频剪辑已经成为一项重要的工作。在繁忙的工作中,如何高效、准确地完成批量剪辑是一项具有挑战性的任务。近年来,AI智剪的出现为视频剪辑工作带来了新的解决方案,引领着批量剪辑的新篇章。在AI智剪的帮助…

为了摆脱 Android ,亚马逊开发基于Linux的操作系统

导读亚马逊一直在开发一种新的操作系统 —— 内部代号为 “Vega”,以便在 Fire TV、智能显示器和其他联网设备上取代 Android 系统。 亚马逊一直在开发一种新的操作系统 —— 内部代号为 “Vega”,以便在 Fire TV、智能显示器和其他联网设备上取代 Andr…

终于有人把数据资产入表知识地图总结出来了,轻松看懂

在当前数字化的浪潮下,数据已经成为劳动、土地、知识、技术以后的第五大生产要素,“数据就是资源”已成为共识。如今数据资产“入表”已成定局,数据资产化迫在眉睫。 2023年8月21日,财政部正式印发《企业数据资源相关会计处理暂行…

什么样的企业可以使用免费版的CRM?

市面上大部分的免费CRM不需要付费即可使用,但是对于使用人数和功能进行了部分限制。下面我们就来说说,免费CRM的适用对象是谁? 1、初创/小微企业 这种小微企业没有太多的资金,也没有复杂的客户管理需求,仅仅需要一款…

生产环境_移动目标轨迹压缩应用和算法处理-Douglas-Peucker轨迹压缩算法

场景: 我目前设计到的场景是:以路面上行驶的汽车为例,即在地图应用中,对GPS轨迹数据进行压缩,减少数据传输和存储开销,因为轨迹点太频繁了,占用空间太大,运行节点太慢了&#xff0c…

姿态估计 手势动作实时识别项目(基于mediapipe、keras进行实现)

姿态估计 手势动作实时识别项目(基于mediapipe、keras进行实现) 0、功能展示1、项目原理介绍2、数据集采集脚本3、将采集到的动作数据集利用mediapipe库检测手部关键点信息,转换成数据信息保存到本地4、训练一个效果一般的随机森林分类器5、使用Kreas训练一个效果好点的全连…

提高软件测试覆盖率的5个重点

软件测试覆盖率是软件测试中的一个重要指标,它有利于保障软件质量、提高软件可靠性和可维护性。软件测试覆盖率能够发现并修复代码缺陷,确保代码的正确性,提高软件的稳定性,降低成本和风险。 因此进一步提高软件测试覆盖率对于软件…

Oauth2认证及Spring Security Oauth2授权码模式

Oauth2认证 Oauth2简介 简介 第三方认证技术方案最主要是解决认证协议的通用标准问题,因为要实现跨系统认证,各系统之间要遵循一定的接口协议。 OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使…

ICCV 23丨3D-VisTA:用于 3D 视觉和文本对齐的预训练Transformer

来源:投稿 作者:橡皮 编辑:学姐 论文链接:https://arxiv.org/abs/2308.04352 开源代码:http://3d-vista.github.io 摘要: 3D视觉语言标定(3D-VL)是一个新兴领域,旨在将…

centos7安装mysql8

打开Mysql下载页面 https://downloads.mysql.com/archives/community/ 选择版本号: centos选择Red Hat版本,复制地址 复制地址后,链接ssh,添加储存库 yum install 粘贴地址; yum install https://downloads.mysql…

人工智能基础_机器学习044_使用逻辑回归模型计算逻辑回归概率_以及_逻辑回归代码实现与手动计算概率对比---人工智能工作笔记0084

上面我们已经把逻辑回归的公式,以及,公式对应的图形都画画出来了,然后我们再来看看 如何用代码实现 可以看到上面是代码,咱们自己去写一下 import numpy as np from sklearn.linear_model import LogistieRegression from sklearn import datasets # 训练数据和测试数据拆分…

人工智能时代下的程序员核心竞争力:构建专属护城河

选题建议:《人工智能时代下的程序员核心竞争力:构建你的护城河》 大纲: I. 引言 A. 人工智能时代的发展趋势B. 程序员面临的挑战与机遇 I. 引言 A. 人工智能时代的发展趋势 随着科技的飞速进步,我们已经踏入了一个日新月异的人工…

Leetcode—2216.美化数组的最少删除数【中等】

2023每日刷题&#xff08;三十六&#xff09; Leetcode—2216.美化数组的最少删除数 实现代码 int minDeletion(int* nums, int numsSize) {int last nums[0], flag 1, ans 0;for(int i 1; i < numsSize; i) {if(flag) { // 前一个下标为偶数if(nums[i] last) {…

Linux C 线程

线程 概述线程和进程的异同如何选择使用进程还是线程 函数获取进程自身ID  pthread_self创建线程  pthread_create退出线程  pthread_exit线程等待  pthread_join 四种线程模型1 &#xff09;单线程2 &#xff09;单线程3 &#xff09;双线程4 &#xff09;三线程 概述…

【HarmonyOS】低代码平台组件拖拽使用技巧之列表

【关键字】 HarmonyOS、低代码平台、组件拖拽、列表、列表项 1、写在前面 我们在日常开发中使用最多的组件可能就是列表组件了&#xff0c;现在几乎所有的应用都离不开列表&#xff0c;那么今天我们就来介绍一下如何利用低代码平台来实现列表的展示&#xff0c;列表实际上也是…

HALCON根据需要创建自定义函数

任务要求&#xff1a; 创建函数myfun(a,b,c)&#xff0c;输入浮点数a&#xff0c;b的值&#xff0c;计算c a b&#xff0c;将计算结果返回。 操作步骤&#xff1a; 1&#xff09;打开HDevelop程序 2&#xff09;打开函数菜单&#xff0c;选择“创建新函数”&#xff0c…

中间件安全:Apache Tomcat 文件上传.(CVE-2017-12615)

中间件安全&#xff1a;Apache Tomcat 文件上传. 当存在漏洞的 Tomcat 运行在 Windows / Linux 主机上&#xff0c;且启用了 HTTP PUT 请求方法(例如&#xff0c;将 readonly 初始化参数由默认值设置为ialse) &#xff0c; 攻击者将有可能可通过精心构造的攻击请求数据包向服务…

java算法学习索引之数组矩阵问题

一 将正方形矩阵顺时针转动90 给定一个NN的矩阵matrix&#xff0c;把这个矩阵调整成顺时针转动90后的形式。 顺时针转动90后为&#xff1a; 【要求】额外空间复杂度为O&#xff08;1&#xff09;。 public void rotate(int[][] matrix) {int tR 0; // 左上角行坐标int tC 0;…