leetcode——设计循环队列

news2024/10/6 5:55:42

在这里插入图片描述
设计循环队列

在这里插入图片描述
这个题目在这里小编只分享一个解题思路,因为还有一个思路小编还在尝试,一直过不了,还在这里不断尝试,等我试出来的时候我在分享给大家,首先我们在这里给出的是数组的形式,后面在分享单链表的思路,因为数组在内存上是连续的,这里给出的思路是多开出一个空间的内存,然后我们在进行插入和删除,下面给一个图来给大家来看看。
在这里插入图片描述
我们可以看到我们这个数组其实是来存储四个字节大小的,但是我们多存储一个int类型大小的空间,如果tail+1 == head的话我们就当空间是满的。但是当我们的head是和tail相等的时候我们就可以认为是空的,所以这里多开一个空间的作用就出来了,就是可以保证这两个有区别,如果我们不是多开一个空间的话,我们怎么来保证他是满的还是空的。


因为我们是tail是指向数组有效空间的最后一个元素的,所以我们这里不多开一个空间的话,就无法来区别什么时候为空,什么时候是满的时候。我们先来看看他的一个接口函数。

在这里插入图片描述
让我们来定义这个循环队列是什么个样子的,首先我们得有一个数组来存储,然会k就是题目说的循环队列里面要存储的数据个数,还有我们得有两个来指向head和tail,其实也可以是指针,但是我们这里用数组下标的方式才是最好的。
有了结构体之后下一个就是给的初始化的函数接口,首先肯定就是结构体中a这个指针,我们得给他malloc一个数组空间出来,其次就是head和tail这两个得初始化为一个值,因为我们后面是有判空的一个接口函数,所以这里并不难分析出来一开始的时候就得给初始化成一样的值,所以这里给0是最合适的,是刚开始的时候没有一个数据存储在里面。

在这里插入图片描述
这里大家可能对这个结构体会有疑问。

在这里插入图片描述
我们一开始就得开辟空间给obj这个指针,他得指向一个有效空间,大小刚刚好就是结构体的大小,然会a在这个结构体中其实就是一个指针大小,因为我们后面只需要让他指向一个数组空间大小就行了。

后面的判空函数就显得格外简单了

在这里插入图片描述
只要是相等的时候,就是空,不只是第一次,我们可以看后面的插入和删除如果出现head和tail是相等的时候这个时候也是为空的
在这里插入图片描述
进行下面的操作之后就是head和tail相等的时候,和我们判断空的时候是一样的,然后需要进行的下一个接口函数就是我们来判断是不是满的时候,因为我们设定的时候tail就是指向后最后一个元素的后面一个元素,所以满的时候就是tail+1 == head的时候,但是我们这个是个循环队列,比如在下面这个图的时候,满的时候进行+1就是越界的行为
在这里插入图片描述
就是这个时候,如果我们进行+1就是5,那我们这里进行的操作就是用一个取模的方法才是最好的,我们知道当我们一个数模上一个比他大的数的时候还是自己本身,所有这里我们可以先让tail+1因为大多的情况下的时候tail是在中间位置,满了的话head就是他的下一个,所有我们这里还需要进行的操作就是在加上一个k+1,这样的话那就可以保证tail是最后位置的时候取模也不会是0.我们在模上一个k+1就可以解决了。

在这里插入图片描述
所以我们写成这样就可以解决问题,这里取模的好处就是刚刚好满足循环,我比你大了,我取模就又可以回来了,解决了如何给他循环起来的问题,如果我们用单链表的就写一个循环链表我们来存储数据就可以解决了。

下一个接口函数就是如何进行插入和删除。我们这里插入就是让我们的tail位置放入数据,然后进行插入就可以解决问题,但是插入之后我们tail得往后移动,但是这里最大的问题就是如果tail到尾巴的时候,我们再进行++又就是越界,那leetcode就会给你一个越界访问的提示,所以这里最好的办法还是取模就可以解决这个问题了,首先就是我们tail得+1,然后因为取模的话我们得先给他加上一个数,这个数要不影响最后的结果,取模的最大左右就是当我们给出一个超大数的时候,最后的结果也是模的那个数和0之间,比如我们模上这里的k+1,然后取模的范围就是0—k+1

在这里插入图片描述
所以我们上面就可以写成这个样子,如果满了的话就不能插入,因为这里返回值是个bool值,所以我们的返回值就是true和false

既然插入需要判断,那删除也是需要判断的,所以空了我们就不要进行删除了。

在这里插入图片描述
这里也是用了这样的方法,其实取模大家可以多带几个数进行感觉,光说的话理解起来是特别的难受的。

在这里插入图片描述
去对头的话直接返回就行,但是去队尾的话需要进行一些操作,因为我们规定的是tail后面的元素,所以要返回的应该是tail前面的一个元素的值,那因为tail可能是再数组下标为0位置的地方,所以我们这里就应该用取模,其实大家发先我们就是加上(k+1)的这个值然后整体取%(k+1),(k+1)%(k+1)就是0其实对原来的是不受影响的。。

在这里插入图片描述
还有就是我们应该怎么来释放我们的空间,看下面的图就是可以知道先后顺序了。

在这里插入图片描述

那今天的分享就到这里,我们后面再见。

在这里插入图片描述

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

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

相关文章

Python loglog()函数

常用坐标下的图像显示 import matplotlib.pyplot as plt import numpy as np import mathplt.figure() x_input np.linspace(1, 10, 50) y_input x_input**2plt.plot(x_input, y_input,r-,linewidth2) plt.show()在loglog函数尺度下的曲线 plt.loglog(x_input, y_input,r-,…

筒仓料位监测|敢不敢对“精度”下狠手!您家筒仓料位测得准吗?

您家是不是还在人工敲仓估算? 您能精确知道料位和库存吗? 您能实时看到库存盈亏吗? 筒仓里装了什么?用了多少? 什么时候进料最划算? 您家的筒仓管理方式可靠吗? 上海思伟筒仓料位监测方案 看…

Atlassian发布最新补贴政策,Jira/Confluence迁移上云最低可至零成本

到2024年2月15日,Atlassian将不再提供对Jira、Confluence、Jira Service Management等Server版产品的支持。 近期,Atlassian推出了一项针对云产品的特殊优惠。现在从Server版迁移到云版,您能享受到高额补贴,甚至成本低至零元。立…

计算机网络——数据链路层简解

1. 前言: 数据链路层,即在物理层之上网络层之下,数据链路层的数据交互可以通过mac来确实身份和发送数据。 说到数据链路层这里简单介绍下设备: 网桥(Bridge): 网桥是一种数据链路层设备&#…

C语言——深入理解指针——函数指针

一、函数指针变量 1.1 函数指针变量的创建 什么是函数指针变量呢&#xff1f; 函数指针变量应该是用来存放函数地址的&#xff0c;未来通过地址能够调⽤函数的。 那么函数是否有地址呢&#xff1f; 我们做个测试&#xff1a; #include <stdio.h> void test() {print…

纽扣电池类产品上架亚马逊澳大利站认证标准要求AS/NZS 62368

纽扣电池一般来说常见的有充电的和不充电的两种&#xff0c; 充电的包括3.6V可充锂离子扣式电池(LIR系列)&#xff0c;3V可充锂离子扣式电池(ML或VL系列)&#xff1b;不充电的包括3V锂锰扣式电池(CR系列)及1.5V碱性锌锰扣式电池(LR及SR系列)。 澳大利亚*已经发布了经批准的《消…

重装系统后如何恢复以前的文件?详细教程大揭秘!

在日常生活中&#xff0c;我们可能会遇到各种计算机问题&#xff0c;其中最严重的问题之一就是需要重装系统。在重装系统之前&#xff0c;我们通常需要考虑一个问题&#xff1a;重装系统后还能恢复以前的文件吗&#xff1f; 首先&#xff0c;我们需要明确一点&#xff0c;重装…

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

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

虹科干货丨TWAMP:什么是双向主动测量协议?

来源&#xff1a;虹科网络安全 虹科干货丨TWAMP&#xff1a;什么是双向主动测量协议&#xff1f; 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导语 TWAMP&#xff08;双向主动测量协议&#xff09;是什么&#xff1f;它在网络性能测量中有什么作用&#xff1f;如…

Java 多线程进阶

1 方法执行与进程执行 GetMapping("/demo1")public void demo1(){//方法调用new ThreadTest1("run1").run();//线程调用new ThreadTest1("run2").start();} 下断点调试信息&#xff0c;可以看到run()方法当前线程是“main1” 继续运行到run里面&…

练习六-使用Questasim来用verilog使用function函数

[TOC](使用Questasim来用verilog使用function函数 1&#xff0c;verilog中使用函数function2&#xff0c;RTL代码3&#xff0c;测试代码4&#xff0c;输出波形 1&#xff0c;verilog中使用函数function 目的&#xff1a; &#xff08;1&#xff09;了解函数的定义和在模块设计中…

问题解决:Ubuntu18.04下nvcc -V指令可用,/usr/local/下却没有cuda文件夹,原因分析及卸载方法

问题描述 今天要运行一个程序&#xff0c;需要CUDA版本高于10.0&#xff0c;我的电脑无法运行&#xff0c;于是开始检查 首先使用nvidia-smi与nvcc -V指令 能够看出来&#xff0c;当前显卡驱动适合的CUDA版本为12.1&#xff0c;而本机安装的版本是9.1.85&#xff0c;那么就需…

使用Navicat将SQL server数据库导入mysql数据库

使用Navicat将SQL server数据库导入mysql数据库 1、使用Navicat Premium打开MySql数据库&#xff0c;然后新建一个数据库名&#xff08;该数据库名称为需要从SqlServer数据库导过来的名称&#xff0c;mysql只有小写&#xff0c;不影响&#xff09; 比如需要将SqlServer数据库…

亚马逊澳大利亚纽扣电池UL4200A认证标准和要求

近来&#xff0c; 与纽扣电池相关的死亡和严重伤害越来越多。 美国消费品安全委员会(CPSC)的工作人员正在参与与消费品电池相关的自愿标准活动&#xff0c;包括UL 4200A -采用锂技术的纽扣或纽扣电池的产品安全标准。 一、适用产品有&#xff1a; 1. 安装有直径 ≤32mm&#x…

在ITSM中,实施变更管理的重要因素!

在ITSM管理中&#xff0c;变更管理是不可或缺的一步。在当今快速变革的商业环境中&#xff0c;组织需要不断地进行变更以适应市场的需求和竞争的压力。 然而&#xff0c;引入变更并成功地实施变更并不容易。变更管理是一种系统化和结构化的方法&#xff0c;旨在确保变更顺利进…

如何利用 AI 写一本书并实现被动收入

如何每个月写一本能赚 5000 美元的书&#xff1f;不少人不知道如何在一周内写作和出版一本书 这里有个教程教你如何利用 AI 写一本书并实现被动收入 [收藏起来以备后用] 推出书友智能写作工具&#xff1a;Bookwiz 不用花几年时间独自写作一本小说&#xff0c;人工智能可以作…

获取1688店铺所有商品、店铺列表api

返回数据格式&#xff1a; 请求链接 {"user": [],"items": {"item": [{"num_iid": "738354436678","title": "国产正品i13 promax全网通5G安卓智能手机源头厂家批发手机","pic_url": "…

【操作系统】文件系统的逻辑结构与目录结构

文章目录 文件的概念定义属性基本操作 文件的结构文件的逻辑结构文件的目录结构文件控制块&#xff08;FCB&#xff09;索引节点目录结构 文件的概念 定义 在操作系统中&#xff0c;文件被定义为&#xff1a;以计算机硬盘为载体的存储在计算机上的信息集合。 属性 描述文件…

JVM的垃圾收集算法

1.算法的分类 1.1标记清除算法 第一步&#xff1a;标记&#xff08;找出内存中需要回收的对象&#xff0c;并且把它们标记出来&#xff09; 根据可达性算法&#xff0c;标记的是存活的对象&#xff0c;然后将其他的空间进行回收 第二步&#xff1a;清除&#xff08;清除掉被…

企业域名邮箱申请流程指南:轻松搭建高效的企业邮箱系统

对于企业和个人来说拥有自己的域名和邮箱是展示形象和开展业务的重要工具&#xff0c;很多初学者可能对企业域名邮箱申请流程感到迷惑。企业域名邮箱申请流程分两步申请域名和创建邮箱&#xff0c;本文将详细介绍这两个步骤&#xff0c;帮助大家更好地理解和操作。 一、申请域名…