设计循环队列

LeetCode——622,设计循环队列 /** * \* Created: liuhuichao * \* Date: 2019/5/30 * \* Time: 30:33 PM * \* Description: 设计循环队列 * \ * 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 * <p> ... 阅读详情

1.循环队列的定义

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

2.构造循环队列,长度为k

head指向对头,tail指向队尾,但是tail指向的空间没有数据存放,需要一个循环长度为k的循环队列时我们需要构造一个长度为k+1的数组多出来的那个空间用来判断队列是否为空是否为满.

typedef struct {
    int* a;
	int head;
	int tail;
	int size;
} MyCircularQueue;

MyCircularQueue* myCircularQueueCreate(int k) {
	MyCircularQueue* My = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
	My->size = k;
	My->head = 0;
	My->tail = 0;
    My->a = (int*)malloc(sizeof(int)*(My->size+1));
	return My;
}

 3.循环队列的数据进出

当我们入数据时再tail指向的空间直接加入数据

但是有一种情况是tail指向了最后一个空间但第一个空间没有数据

当遇到这种情况时我们同样再在tail指向的位置进行入数据

但入完数据之后进行运算 

tail = (tail + 1) % (size+1);

使tail回到第一个空间

当这种情况时tail指向空间的下一个位置是head的时候那么这个队列是满的那么这时候就不能再向队列里添加数据

当这种情况时tail和head指向同一个空间时队列是空的

当这种情况head指向队列最后一块空间时要删除数据,删除后需要对head进行运算

head=(head+1)%(size+1)

使head回到队列的第一个空间

代码实现

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
	if ((obj->tail+1)%(obj->size+1)!=obj->head)
	{
		obj->a[obj->tail] = value;
		obj->tail = (obj->tail + 1) % (obj->size+1);
        return true;
	}
	else
	{
		return false;
	}
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
	if (obj->tail!=obj->head)
	{
		obj->head=(obj->head+1)%(obj->size+1);
        return true;
	}
	else
	{
		return false;
	}
}

4.取对头的数据

int myCircularQueueFront(MyCircularQueue* obj) {
	if (obj->tail==obj->head)
	{
		return -1;
	}
	else
	{
		return obj->a[obj->head];
	}
}

5.取队尾的数据 

在取队尾的数据时我们同样会遇到这种情况我要要对tail进行运算使它能够指向队尾

tail = (tail + 1) % (size+1);

int myCircularQueueRear(MyCircularQueue* obj) {
	if (obj->tail==obj->head)
	{
		return -1;
	}
	else
	{
		return obj->a[(obj->tail+obj->size)%(obj->size+1)];
	}
}

6.判断队列是否为空

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
	if (obj->head==obj->tail)
	{
		return true;
	}
	else
	{
		return false;
	}
}

7.判断队列是否为满 

bool myCircularQueueIsFull(MyCircularQueue* obj) {
	if ((obj->tail+1)%(obj->size+1)==obj->head)
	{
		return true;
	}
	else
	{
		return false;
	}
}

8.释放队列空间

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

9.整体代码

typedef struct {
    int* a;
	int head;
	int tail;
	int size;
} MyCircularQueue;

MyCircularQueue* myCircularQueueCreate(int k) {
	MyCircularQueue* My = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
	My->size = k;
	My->head = 0;
	My->tail = 0;
    My->a = (int*)malloc(sizeof(int)*(My->size+1));
	return My;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
	if ((obj->tail+1)%(obj->size+1)!=obj->head)
	{
		obj->a[obj->tail] = value;
		obj->tail = (obj->tail + 1) % (obj->size+1);
        return true;
	}
	else
	{
		return false;
	}
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
	if (obj->tail!=obj->head)
	{
		obj->head=(obj->head+1)%(obj->size+1);
        return true;
	}
	else
	{
		return false;
	}
}

int myCircularQueueFront(MyCircularQueue* obj) {
	if (obj->tail==obj->head)
	{
		return -1;
	}
	else
	{
		return obj->a[obj->head];
	}
}

int myCircularQueueRear(MyCircularQueue* obj) {
	if (obj->tail==obj->head)
	{
		return -1;
	}
	else
	{
		return obj->a[(obj->tail+obj->size)%(obj->size+1)];
	}
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
	if (obj->head==obj->tail)
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
	if ((obj->tail+1)%(obj->size+1)==obj->head)
	{
		return true;
	}
	else
	{
		return false;
	}
}

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

Day01 Geant4学习 ​ 用来记录粒子在每个step中的信息的,例如位置,能量,动量.例如,假设每一个粒子都有一个属于自己的id,会记录自己的轨迹状态信息就是track,当他发生反应时,就会产生新的id。​ 最终在新建的build文件夹中的vis.mac文件中设置,是自带的,如果有更高的需求可以自己去更改,但是一般都是写好的,设置好了图形界面的一些东西,呈现的自己建模的图形界面多大,需不需要网格什么的。从反应到结束的过程,其中也包括它产生的刺激粒子的反应到结束的过程,成为一个事件event。 阅读详情

相关推荐

Excel数据清洗实战:8个必学函数搞定90%的脏数据问题(附案例)

本文通过一个完整的销售数据清洗案例,详细讲解了如何组合使用TRIM、CLEAN、SUBSTITUTE等8个核心Excel函数,构建自动化清洗流水线,高效解决日常办公中90%的脏数据问题,从而将时间留给更有价值的分析工作。

weixin_29215391的博客 584

LeetCode 设计循环队列

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 你的实现应该支持如下操作: MyCircula...

hestyle的博客 1150

五分钟搞懂游戏开发中的抗锯齿算法

常见抗锯齿算法总结锯齿由来抗锯齿算法SSAAMSAACSAA 锯齿由来 场景的定义在三维空间中是连续的,而最终显示的像素则是一个离散的二维数组,这是计算机屏幕产生锯齿的原因。在计算机处理图形的过程中(渲染管线了解一下),有一个非常重要的阶段,就是光栅化,光栅化主要的作用是将顶点数据的不连续性通过插值计算,将两个顶点之间不存在的点进行弥补,然后实现到屏幕像素点上的一一映射。如图,现在要在屏幕上绘制一...

绿洲守望者 1万+

力扣题库设计循环队列

题目要求: 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 你的实现应该支持如下操作: MyC...

m1059247324的博客 584

Jetson Orin Nano Super开发板实战:视觉模型部署与性能优化指南

本文详细介绍了Jetson Orin Nano Super开发板在边缘AI视觉模型部署与性能优化的完整实战指南。内容涵盖JetPack 6.1环境配置、Docker容器化部署、YOLO11及Transformer模型的TensorRT优化技巧,并通过实测数据展示了性能提升与功耗管理策略,为开发者提供高效的视觉AI部署解决方案。

7h6j5k4l3的博客 1196

【系统分析师】2025年上半年真题:案例分析-答案及详解(回忆版)

摘要: 试题一考查面向对象分析,涉及用例模型构建的四个阶段(识别参与者、合并需求、细化描述、调整模型),分析CRM系统的参与者与用例,并说明用例间的包含、扩展和泛化关系。 试题二探讨嵌入式Docker,包括容器的轻量性、可移植性及隔离性含义,10项措施与7个规范方面的对应关系,以及优化容器切换时间的三种方法(如无状态连接优化)。 试题三聚焦数据库设计,分析订单表的函数依赖与范式分解(BCNF),讨论分解后是否保持函数依赖及无损性,并针对触发器的性能缺陷提出优化方案。 试题四解析Web开发中的MVC架构与SS

数据知道的博客 6612

622设计循环队列

设计循环队列 题目描述:设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:...

dreamLC1998的博客 198

Autosar软件组件分析及ARXML文件分析

Autosar软件组件分析及ARXML文件分析

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 3604

循环队列+OJ题之设计循环队列

学了普通的队列,循环队列也该拿下了

adcxhw的博客 1241

深度解析电力负荷预测:基于深度学习的完整实战指南

电力负荷预测是智能电网运行中的核心技术之一,准确的负荷预测对于电网的稳定运行、电力市场交易以及能源调度具有重要意义。本文将详细介绍电力负荷预测的完整解决方案,从数据预处理、特征工程到模型构建与评估,提供完整的可执行代码。我们将使用LSTM(长短期记忆网络)和Transformer两种主流深度学习模型进行实现,并通过实际数据集验证模型效果。电力负荷预测是指根据历史负荷数据、气象因素、时间特征等多维信息,预测未来某一时段的电力需求。超短期负荷预测:未来几分钟到几小时短期负荷预测:未来1天到1周中期负荷预测。

YOLO 111

python乘法运算 信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析

本文解析了全国青少年信息素养大赛Python编程挑战赛的乘法运算题目。题目要求通过递归算法实现两个自然数的乘法运算,并输出算式。算法分析指出可将乘法转化为累加,使用递归函数实现。程序代码展示了一个自定义函数add(),通过递归调用完成累加运算。文章还分析了考点,包括递归函数、输入处理、分支语句等编程基础知识的应用。最后强调解题方法的多样性,重点在于理解递归原理和实现题目要求。该题目难度适中,主要考查选手对递归算法的理解和编程基础能力。

青少年编程学习指导 789

【数据结构与算法】设计循环队列

🚩前面我们用队列实现了一个栈用栈实现了一个队列,相信大家随随便便轻松拿捏,而本章将带大家上点难度,我们来设计一个循环队列。🚩对于循环队列,重点就在一个“ 循环 ”,意思也就是该队列首尾相连形成一个环,但其本质还是不变,队列先进先出的性质依旧存在,只不过环的大小有限定(限定放多少数据就只能放多少数据)。🚩那么我们如何来设计这样的一个环,使它既能够像队列一样,又可以体现循环的性质?下面就带大家探讨一波。💝设计一个循环队列还是有些复杂的呢,不过看过本文章,相信大家也可以轻松拿捏。❤️‍🔥。

Welcome home | Jian Liao 's blog 3254

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【LeetCode】622. 设计循环队列

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 你的实现应该支持如下操作: MyCircul...

syc233588377的博客 3070

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【数据结构】设计循环队列

🏷️力扣地址:🌈622. 设计循环队列💥特别注意:🌠动图解析:👇🏻💫关键思路:🌠动图解析:👇🏻代码实现💡: 🎄判断队列是否满 💫关键思路:定义一个next作为tail的下一个节点【极端思维】当next去到 的时候,next就要回到的位置🌠动图解析:👇🏻代码实现💡: 🎄判断队列是否为空 💫关键思路:这里比较简单直接上代码 代码实现💡: 🎄出队列 💫关键思路:代码实现💡: 🎄取出队尾数据 💫关键思路:🌠画图解析:👇🏻代码实现💡: 🎄销毁队列 ............

qq_42996461的博客 1500

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

622. 设计循环队列

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 你的实现应该支持如下操作: MyCirc...

Umbrella Corporation 6954

Leetcode 循环队列设计

题目描述如下: 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 你的实现应该支持如下操作: MyCircularQueue(k): 构造器,设置队列长度为 k 。 Front: 从队首获取元素。如果队列为空

zxxc111的博客 335

【练习题】设计循环队列

对于这个题,我们采用了两种方法用链表创建用数组创建这两种方法各有优势,用链表创建是在创建时会很麻烦要手动开辟一个循环链表,而数组就简单的多,但是当建立好链表后,后续的思路比较清晰没有那么多坑。用数组创建的优势是可以下标访问,不用像链表那样还要循环遍历,降低了空间复杂度,而且数组在缓存利用率上有天然的优势。

2302_79968411的博客 2343

LeetCode 622. 设计循环队列

设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。FrontReardeQueue()isEmpty()isFull()// 设置长度为 3// 返回 true// 返回 true// 返回 true。

m0_56090828的博客 1311

[队列]leetcode622:设计循环队列

class MyCircularQueue { private: int front;//队头 int tail;//队尾 vector<int> data;//队列的数据 int size;//长度 public: /** Initialize your data structure here. Set the size of the qu...

algsup 539

【LeetCode 】: 622. 设计循环队列

622. 设计循环队列 问题描述: 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 题目链接:...

qq_36008321的博客 1241

数据结构循环队列-设计循环队列

循环队列的提出及其设计

m0_69597277的博客 605
上一篇: 用两个队列实现栈
下一篇: 堆排序(向下调整)
Arcane Code
博客等级 码龄3年 598粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值