leetcode经典例题之环形队列

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;elsereturn obj->a[obj->head];
}int myCircularQueueRear(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[(obj->tail + obj->k ) % (obj->k + 1)];  
}void myCircularQueueFree(MyCircularQueue* obj) 
{free(obj->a);free(obj);
}



4、结语


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

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

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

相关文章

Python---NumPy万字总结【此篇文章内容难度较大,线性代数模块】(3)

NumPy的应用(3) 向量 向量(vector)也叫矢量,是一个同时具有大小和方向,且满足平行四边形法则的几何对象。与向量相对的概念叫标量或数量,标量只有大小,绝大多数情况下没有方向。我们…

找不到iutils.dll怎么解决,需要如何修复

iutils.dll 是一个系统级的动态链接库(Dynamic Link Library)文件,通常与Windows操作系统中的应用程序运行密切相关。动态链接库文件如同一个代码库,存储了多个程序可以共享的功能和指令。iutils.dll具体提供了哪些功能可能依据它…

模型 洋葱模型(组织文化方向)

系列文章 分享 模型,了解更多👉 模型_思维模型目录。层层深入,探索核心。 1 洋葱模型的应用 1.1 洋葱模型用于职业规划 有一个名叫李明的大学生,他最近感到迷茫和压力,因为他即将毕业并面临职业选择。李明决定寻求心…

Skywalking 8.x部署

一、下载版本 Skywalking 官网下载地址 版本地址 大家各自选取对应的版本即可 解压后: 二、修改配置 找到config目录下的application.yml 1. 修改存储方式为mysql 修改数据库jdbc连接信息 下一步懂得都懂,那肯定就需要mysql-connector-java-8.0.16写入mysql的…

【一触即发】快来围观C3安全大会酷炫九宫格!

C3安全大会2024 2024年5月18日 南京扬子江国际会议中心 C3安全大会2024 即将揭幕! 图解C3 | 九宫格 数智变革,“AI”正以其颠覆性力量,重塑我们对未来的定义。亚信安全邀您共襄盛举,见证这场于5月18日盛大开幕的C3安全大会2024…

Linux(多线程)

//blockQueue.hpp #pragma once #include <iostream> #include <queue> #include <pthread.h> const int gcap 5; template <class T> class BlockQueue { public:BlockQueue(const int cap gcap):_cap(cap)//初始化阻塞队列的容量{pthread_mutex_in…

力扣HOT100 - 70. 爬楼梯

解题思路&#xff1a; 动态规划 注意 if 判断和 for 循环 class Solution {public int climbStairs(int n) {if (n < 2) return n;int[] dp new int[n 1];dp[1] 1;dp[2] 2;for (int i 3; i < n; i) {dp[i] dp[i - 1] dp[i - 2];}return dp[n];} }

美股开户,你需要知道这些!

想投资美股&#xff0c;却不知道开户需要多少钱&#xff1f; 别担心&#xff0c;这篇专栏将告诉你美股开户的资金要求以及相关注意事项。 1. 美股开户需要多少钱&#xff1f; 答案是&#xff1a;有的&#xff0c;但门槛并不高。不同平台对开户资金的要求有所不同&#xff0c;一…

visual studio2022 JNI极简开发流程

文章目录 1 创建java类2 生成JNI头文件3 使用visual studio2022创建DLL项目3.1 选择模板中&#xff08;Windows桌面向导&#xff09;3.2 为项目命名3.3 选择应用程序类型为动态链接库3.4 项目概览 4 导入需要的头文件4.1 导入需要的头文件4.2 修改头文件 5 编写C实现6 生成dll文…

外卖点餐小程序平台源码系统 自由切换 轻松管理 附带源码代码包以及系统搭建教程

系统概述 外卖点餐小程序平台源码系统是一款集点餐、支付、配送、评价等功能于一体的综合性平台。该系统采用先进的互联网技术&#xff0c;支持多种支付方式&#xff0c;包括微信支付、支付宝等&#xff0c;同时支持多平台使用&#xff0c;包括微信小程序、支付宝小程序等。商…

【C++】string类常用函数用法总结

目录 常用函数一览 默认成员函数 与容量有关的函数 part 1 part 2 part 3 与访问和遍历有关的函数 与修改有关的函数 npos 与string相关的其它常用函数 常用非成员函数 getline和cin的区别 常用函数一览 //默认成员函数 string();string(const char* s);string(si…

专题模块项目功能说明和运行方法-01

项目集介绍 SpringbootSeries父工程 此模块中只有一个pom.xml文件&#xff0c;是后面所有模块的父模块&#xff0c;主要功能有两个&#xff1a;子模块管理和依赖管理。 类别必选可选基础框架jdk 17 spring-boot-starter 3.2.4spring-boot-starter-web 3.2.4spring-cloud 2023…

Find My腰包|苹果Find My技术与腰包结合,智能防丢,全球定位

腰包具有显瘦和显高的双重功效&#xff0c;它不仅能提高腰线、拉长腿部线条&#xff0c;还能遮住腹部多余的赘肉&#xff0c;从而在视觉上达到变高的效果&#xff0c;使整体看起来更加显瘦。除了时尚功能&#xff0c;腰包在运动中也有其独特的用途。例如&#xff0c;在跑步时&a…

基于SPWM控制策略的二极管钳位型的五电平逆变器simulink仿真

本人搭建了二极管钳位型五电平逆变器simulink仿真模型&#xff0c;SPWM采用层叠&#xff0c;输出线电压9电平&#xff0c;相电 压5电平&#xff0c;滤波后对称三相电压、电流&#xff0c;THD<5%&#xff0c;效果十分优越&#xff0c;适合新手学习使用。 模型获取链接&…

杨校老师项目之基于大数据技术栈hadoop商业web应用的日志分析系统

获取全套资料&#xff1a; 有偿获取&#xff1a;mryang511688 摘要&#xff1a; 互联网世界的先驱者们一致认为大数据将是未来互联网产业&#xff0c;甚至是整个人类各个产业的基础资源&#xff0c;那么到底什么是大数据&#xff0c;大数据给我们的世界是如何带来变化的呢&am…

拥抱数字化转型,解锁企业新质生产力的无限可能

新质生产力是推动社会进步的强大动力&#xff0c;而数字化转型则是释放这种生产力的关键。通过拥抱数字化转型&#xff0c;企业可以解锁新质生产力的无限可能&#xff0c;从而在激烈的市场竞争中脱颖而出。” 企业为什么要数字化转型&#xff1f; 新质生产力&#xff0c;这一…

MyBatis(该篇足已)

目录 一.MyBatis是什么&#xff1f; 二.为什么学习MyBatis呢&#xff1f; 三.MyBatis的学习 3.1MyBatis的开发流程 3.2MyBatis项目 四.MyBatis的增删改操作 五.参数占位符 #{} 和 ${} 六.映射返回 七.映射失败 八.数据库连接池 九.动态SQL 9.1<if>标签 9.2&…

【仅1月出刊】普刊广涉计算机、社科、教育、法学等多领域!

【欧亚科睿学术】 1 EURASIA JOURNAL OF SCIENCE AND TECHNOLOGY 终审周期 仅1月出刊&#xff08;知网收录&#xff09; 《欧亚科学技术杂志》 Print ISSN&#xff1a;2663-1024 Online ISSN&#xff1a;2663-1016 出版社&#xff1a;UPUBSCIENCE 【简介】本刊致力于传播…

[淘宝销量]—采集分析—实例参考▶

[干货] 本文爬取淘宝的搜索结果&#xff0c;包含标题、价格、原价、店铺、月销量字段。将结果保存成csv格式&#xff0c;并作简单分析。以手机为例。【淘宝销量】 用到的python库&#xff1a;selenium、urllib、pyquery、pandas。 1.爬取页面分析 1.1 获取URL 打开淘宝&am…

集成学习思想

概述 集成学习思想 线性回归、逻辑回归、决策树都是单一模型预测我们想把多个相同模型、多个不同种类的模型组合起来&#xff0c;形成一个更强大的模型进行预测 集成学习概念&#xff1a;将多个学习器&#xff08;也称为基学习器&#xff09;组合成一个更强大的学习器的机器…