leetcode经典例题之环形队列

news2024/11/24 4:53:07
P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

目录

  • 1、题目展示
  • 2、问题分析
  • 3、完整代码展示
  • 4、结语

1、题目展示

在这里插入图片描述


  在拿到题目时,通过分析我们知道,环形队列是一个有用固定位置数的队列,若队列已满就不能再向其中插入数据,且队列为循环,及队列的尾部的下一个为队列的头部。
  在这种前提条件下,我们会联想到可以使用链表的形式进行实现,但是在使用链表创建队列时,需要开辟出题目要求数量的节点,并将其连接起来,十分麻烦,且在进行删除插入操作时会有对指针的操作,容易出现bug,故本文仅对如何使用数组来实现循环队列进行讲解。


2、问题分析


  当使用数组来实现队列时,我们可以先假设题目要求创建四个空间存储空间的循环队列,示意图如下:

在这里插入图片描述  在创建好数组之后我们又如何让其可以循环呢,可以思考,当指向下标的位置越过了数组限制下标3时,我们让他取模,并回归到数组的0下标,或者也可以设置一个size来记录数组内数据的个数,并通过size来进行循环。


  可循环的问题解决了,那我们如何判断循环队列中的空间是否满了或者空呢,我们可以设置两个数分别为head和tail,让其指向数组的首元素下标,即开始时head和tail都为0,当head和tail相等时,就判断它时空的循环队列。
  可这时问题又出现了,当我们队列里存满了数据时,head也和tail相等,这就造成了很明显的bug,无法判断是相等还是空,这时我们可以在创建数组时多创建一个空间,比如说我们需要四个空间,在创建时就创建五个空间,但是数组里最多只存储四个数据,即总有一个空间是不存储数据的,这样就完美的解决了假溢出的问题。示意图如下:

在这里插入图片描述

  此时我们假设进行两步操作,第一次向循环队列中插入四个数据,第二次删除四个数据。示意图分别如下:
在这里插入图片描述
在这里插入图片描述


  我们可以明显地发现当tail的下一个位置为head时,循环队列时满的状态,当tail等于head时,循环队列是空的状态。
  至此我们便可以依据此种规律进行代码的书写。


3、完整代码展示


  至于如何对越界的head和tail进行取模转换,是一个数学上的问题,再此不再做过多的详解,看官可通过数学知识自行解答,下面是完整代码展示:
typedef struct 
{
    int* a;
    int head;
    int tail;
    int k;
} MyCircularQueue;


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

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

bool myCircularQueueIsFull(MyCircularQueue* obj) 
{
    return (obj->tail + 1) % (obj->k + 1) == obj->head;
}

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

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

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

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


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




4、结语


  十分感谢您观看我的原创文章。
  本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
  如需引用,注明地址。

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

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

相关文章

SSH常用功能介绍-高级功能

一、介绍 SSH(Secure Shell)是一种用于远程登录和执行命令的网络协议,它提供了加密的连接,保证了数据的安全性。除了基本的远程登录功能外,SSH还提供了许多高级功能,以下是一些常用的高级功能介绍&#xf…

26版SPSS操作教程(高级教程第二十章)

目录 前言 粉丝及官方意见说明 第二十章一些学习笔记 第二十章一些操作方法 神经网络与支持向量机 人工神经网络(artificial neural network,ANN) 假设数据 具体操作 结果解释 对案例的进一步分析 结果解释 ​编辑 尝试将模型复…

mmdetection在训练自己数据集时候 报错‘ValueError: need at least one array to concatenate’

问题: mmdetection在训练自己数据集时候 报错‘ValueError: need at least one array to concatenate’ 解决方法: 需要修改数据集加载的代码文件,数据集文件在路径configs/base/datasets/coco_detection.py里面,需要增加meta…

水经微图万能版、专业版与企业版的区别?

水经微图(以下简称“微图”)的版本,主要分为万能版、专业版和企业版三个版本。 什么是万能版? 万能版是指“水经注万能地图下载器”软件功能的授权,虽然该软件已经停止更新,但购买过该软件的用户&#xf…

简单的DbUtils工具类【精细】

目录 单条通用增删改方法 1.创建maven项目,并加载依赖 2.创建数据库连接工具类(Dbutils类) 3.创建一个执行器(SqlExecutor类) 4.通用(增,删,改)方法 1.创建方法 2.创建userInfo实体类 3.创建测试类,测试增,删&#xf…

leetcode-最长公共子序列(二)-103

题目要求 思路 step 1:优先检查特殊情况。 step 2:获取最长公共子序列的长度可以使用动态规划,我们以dp[i][j]dp[i][j]dp[i][j]表示在s1中以iii结尾,s2中以jjj结尾的字符串的最长公共子序列长度。 step 3:遍历两个字…

C++——缺省参数与重载函数

目录 ​前言 一.缺省参数 1.1缺省参数概念 1.2缺省参数分类 注意事项: 二.函数重载 2.1函数重载概念 2.2c支持函数重载原理——命名修饰 前言 本篇文章主要讲述c中有关于缺少参数与函数重载的相关概念与实例,以下是本人拙见,如有错误…

文件夹重命名高效批量技巧:轻松实现在文件夹名称左边添加关键字

在日常工作和生活中,我们经常需要对大量的文件夹进行重命名,以便更好地组织和管理文件。然而,手动一个接一个地修改文件夹名称既费时又费力。幸运的是,有一些高效的批量重命名技巧可以帮助我们快速实现这一目标,特别是…

算法学习笔记(3)-差分

#差分 差分和前缀和互为逆运算: 给定一个原数组s,差分数组h,两者的关系如下所示: s[i] h[1] h[2] h[3] …… h[i] 针对于上面的公式,由差分数组h推导而来 h[1] s[1] h[2] s[2] - s[1] h[3] s[3] - [2] …… h[…

vue前端时间段选择控件

实现效果: 可选具体的某天的某时某分某秒 vue前端代码: <el-form-item label"日期"><el-date-pickerv-model"daterangerq"style"width: 240px"value-format"yyyy-MM-dd HH:mm:ss"type"datetimerange"range-separat…

Spring,SpringMVC,SpringBoot知识总结

1.简述Spring,SpringMVC&#xff0c;SpringBoot各自特点及联系 Spring、Spring MVC 和 Spring Boot 是 Java 开发中常用的三个框架&#xff0c;它们之间有以下关系&#xff1a; Spring&#xff1a;是一个全功能的 JavaEE 应用程序框架。它提供了一系列的解决方案&#xff0c…

【管理咨询宝藏99】离散制造智能工厂战略规划方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏99】离散制造智能工厂战略规划方案 【格式】PDF版本 【关键词】智能制造、先进制造业转型、数字化转型 【核心观点】 - 推进EHS、品质一致性、生…

通配符证书260元

通配符SSL证书是一种特殊的数字证书&#xff0c;可以保护域名以及该域名下的所有子域名。不论是个人开发者还是企业开发者&#xff0c;只需要购买一个通配符SSL证书&#xff0c;就可以为多个子域名提供传输数据加密服务&#xff0c;降低了多子域名网站开发者购买SSL证书的成本。…

ArcGIS水文水环境数据编辑、管理、处理与分析;ArcGIS水文分析及流域特征提取;湖泊水库水环境监测及评价;河道水污染预测与水环境容量计算等案例实践

目录 专题一 ArcGIS&#xff1a;数据管理 专题二 ArcGIS&#xff1a;数据转换 专题三 ArcGIS&#xff1a;地图制作 专题四 水文水环境数据编辑与管理 专题五 水文水环境数据处理与分析 专题六 ArcGIS水文分析及流域特征提取 专题七 湖泊水库水环境监测及评价 专题八 河…

redis服务连接及常规操作和redis服务getshell

简介 Redis&#xff0c;英文全称是Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 redis服务于传统服务器不同&…

flink尚硅谷

flink 1 flink基础使用1.1 角色1.2 部署模式&#xff08;抽象&#xff09;1.2.1 会话模式1.2.2 单作业模式1.2.3 应用模式 1.3 运行模式&#xff08;实际 谁来管理资源&#xff09;1.3.1 Stand alone1.3.2 YARN运行模式&#xff08;重点&#xff09; 2. 运行时架构2.1 系统架构…

程序员如何避免35岁危机?

所谓的“35岁危机”通常是指在职业生涯中遇到的一个挑战阶段&#xff0c;这个概念在不同行业和个人中有不同的体现。对于程序员来说&#xff0c;这可能与技术更新迅速、工作强度大、职业发展路径的不确定性等因素有关。 以下是一些建议&#xff0c;帮助程序员避免或缓解这一危机…

三丰云免费虚拟主机与免费云服务器评测

三丰云是一家知名的云计算服务提供商&#xff0c;提供免费虚拟主机和免费云服务器的服务。今天我们就来为大家介绍一下三丰云的免费虚拟主机和免费云服务器的使用体验。首先&#xff0c;让我们来看看三丰云的免费虚拟主机服务。三丰云的免费虚拟主机提供了稳定可靠的空间和带宽…

智能优化算法 | Matlab实现KOA开普勒优化算法(内含完整源码)

智能优化算法 | Matlab实现KOA开普勒优化算法(内含完整源码) 文章目录 智能优化算法 | Matlab实现KOA开普勒优化算法(内含完整源码)文章概述源码设计文章概述 智能优化算法 | Matlab实现KOA开普勒优化算法(内含完整源码) 源码设计 %% clear all clc N=25; % Number of s…

【Java】:方法重写、动态绑定和多态

目录 一个生动形象的例子 场景设定 1. 方法重写&#xff08;Method Overriding&#xff09; 2. 动态绑定&#xff08;Dynamic Binding&#xff09; 3. 多态&#xff08;Polymorphism&#xff09; 归纳关系&#xff1a; 重写 概念 条件 重写的示例 重载与重写的区别 …