当前位置: 首页 > news >正文

LeetCode—设计循环队列(两种方法)

1.题目 

2.思路一(数组)

通过数组进行模拟,通过操作数组的索引构建一个虚拟的首尾相连的环。再循环队列结构中,设置一个队首head和队尾tail,数组的大小固定为k。

初步分析:存在缺陷

改善假溢出问题:

(1) 用size记录数组长度

(2) 多开辟一块空间

 这里,我们选择方案二解决:

 我们对取尾进行分析:

3参考代码(数组解决)

typedef struct {int* a;int head;//头下标int tail;//尾的下一个的下标int k;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));//多开一个空间解决假溢出问题obj->a = malloc(sizeof(int)*(k +1));obj->head = obj->tail = 0;obj->k = k;return obj;
}//判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->head == obj->tail;
}
//判满
bool myCircularQueueIsFull(MyCircularQueue* obj) {//模(K+1)解决回绕的问题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;else{++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;else{//1//return obj->tail == 0 ? obj->a[obj->k] : obj->a[obj->tail - 1];     //2//return obj->a[((obj->tail -1) +(obj->k + 1))%(obj->k + 1)]//简化后return obj->a[(obj->tail + obj->k )%(obj->k + 1)];}}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

 4.思路二(链表)

 用单链表实现队列较为简单,入队列时,将新的元素尾插插入到链表的尾部;出队列时,将链表的都节点返回,并将头指针指向下一个节点。

创建循环队列

head:链表的头结点,队列的头结点

tail:链表的尾节点,队列的尾节点

capacity:队列的容量

size:队列当前元素的数量

//创建循环队列
typedef struct {struct ListNode* head;//队列头节点struct ListNode* tail;//队列尾节点int capacity;//队列容量int size;//队列当前元素数量
} MyCircularQueue;

5.参考代码(链表解决)

//创建循环队列
typedef struct {struct ListNode* head;//队列头节点struct ListNode* tail;//队列尾节点int capacity;//队列容量int size;//队列当前元素数量
} MyCircularQueue;//初始化
MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->capacity = k;obj->size = 0;obj->head = obj->tail = NULL;return obj;
}
//入队列
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(obj->capacity == obj->size)return false;//创建新节点struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));newnode->val = value;newnode->next = NULL;if(!obj->head)//空链表{obj->head = obj->tail = newnode;}else//非空链表,尾插{obj->tail->next = newnode;obj->tail = newnode;}obj->size++;return true;
}
//出队列(先入先出)
bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(obj->size == 0)return false;struct ListNode* node = obj->head;obj->head = obj->head->next;obj->size--;free(node);return true;
}
//返回队首元素
int myCircularQueueFront(MyCircularQueue* obj) {if(obj->size == 0)return -1;return obj->head->val;
}
//返回队尾元素
int myCircularQueueRear(MyCircularQueue* obj) {if(obj->size == 0)return -1;return obj->tail->val;
}
//判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->size == 0;
}
//判满
bool myCircularQueueIsFull(MyCircularQueue* obj) {return obj->size == obj->capacity;
}
//销毁队列
void myCircularQueueFree(MyCircularQueue* obj) {//一次销毁节点for(struct ListNode* cur = obj->head;cur;){struct ListNode* node = cur;cur = cur->next;   free(node);}free(obj);
}

相关文章:

LeetCode—设计循环队列(两种方法)

1.题目 2.思路一(数组) 通过数组进行模拟,通过操作数组的索引构建一个虚拟的首尾相连的环。再循环队列结构中,设置一个队首head和队尾tail,数组的大小固定为k。 初步分析:存在缺陷 改善假溢出问题&#…...

python “名称空间和作用域” 以及 “模块的导入和使用”

七、名称空间和作用域 可以简单理解为存放变量名和变量值之间绑定关系的地方。 1、名称空间 在 Python 中有各种各样的名称空间: 全局名称空间:每个程序的主要部分定义了全局的变量名和变量值的对应关系,这样就叫做全局名称空间 局部名称…...

Pycharm导入自定义模块报红

文章目录 Pycharm导入自定义模块报红1.问题描述2.解决办法 Pycharm导入自定义模块报红 1.问题描述 Pycharm 导入自定义模块报红,出现红色下划线。 2.解决办法 打开【File】->【Setting】->【Build,Execution,Deployment】->【Console】->【Python Con…...

LLMs之KG-RAG:KG-RAG(基于知识图谱的RAG系统)的简介(可以解决多跳问题/同时支持结构化和非结构化数据查询)、经验技巧、案例应用之详细攻略

LLMs之KG-RAG:KG-RAG(基于知识图谱的RAG系统)的简介(可以解决多跳问题/同时支持结构化和非结构化数据查询)、经验技巧、案例应用之详细攻略 背景痛点:传统的基于向量相似度检索的RAG模型回答多环(多步)问题的能力有限,无法同时处理来自多个文…...

综合模型及应用(图论学习总结部分内容)

文章目录 前言六、综合模型及应用(以题目总结为主)分层图思想(包括拆点建图) e g 1 : 通信线路 eg1:通信线路 eg1:通信线路​​​[A-Telephone Lines](https://ac.nowcoder.com/acm/contest/1055/A)(蓝书例题) e g 2 : 小雨坐地铁 eg2:小雨坐地铁 eg2:小雨坐地铁​ [1012-小雨坐…...

2025考研专业课、英语、数学、政治视频大全,整理全了!

考研季又到了,备考的小伙伴们,你们准备好了吗? 时间管理 考研是一场与时间的赛跑,合理安排时间,让复习更高效! - 制定详细的学习计划,每天、每周、每月都有明确目标 - ‍♂️ 保持一定的学习…...

设计模式之策略模式(一)

背景: 下单时有很多情况,有的是用户下单,有的是卡密下单,有的是下游下单,有的是需要唤起支付,有的不需要支付,这样就需要写很多下单接口,下面使用策略模式优化这种情况 代码结构 com.example.order ├── controller │ └── OrderController.java ├── service │ …...

常见网络攻击及解决方案

网络安全是开发中常常会遇到的情况,为什么会遇到网络攻击,网络攻击是如何进行的,如何抵御网络攻击,都是我们需要思考的问题。 为什么会遇到网络攻击? 以下是一些主要的因素: 技术漏洞:软件或操…...

【挑战30天首通《谷粒商城》】-【第一天】【10 番外篇】 解决docker 仓库无法访问 + MobaXterm连接VirtualBox虚拟机

文章目录 课程介绍 1、解决docker 仓库无法访问 2、 MobaXterm连接VirtualBox虚拟机 Stage 1:下载MobaXterm选择适合你的版本 Stage 2:vagrant ssh 连接,开启ssh访问 Stage 2-1:su获取root账号权限,输入密码(默认vagra…...

【C++】每日一题 17 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 可以使用回溯法来解决这个问题。首先定义一个映射关系将数字与字母对应起来…...

vue预览PDF文件的几种方法

1.使用iframe标签预览PDF文件 1.1页面结构 html <iframe:src"fileUrl"id"iframeBox"ref"iframeRef"frameborder"0"style"width: 100%; height: 800px"></iframe>1.2 js代码 export default {data() {return {…...

深度学习入门到放弃系列 - 阿里云人工智能平台PAI部署开源大模型chatglm3

通过深度学习入门到放弃系列 - 魔搭社区完成开源大模型部署调用 &#xff0c;大概掌握了开源模型的部署调用&#xff0c;但是魔搭社区有一个弊端&#xff0c;关闭实例后数据基本上就丢了&#xff0c;本地的电脑无法满足大模型的配置&#xff0c;就需要去租用一些高性价比的GPU机…...

GPT-4o,AI实时视频通话丝滑如人类,Plus功能免费可用

不开玩笑&#xff0c;电影《她》真的来了。 OpenAI最新旗舰大模型GPT-4o&#xff0c;不仅免费可用&#xff0c;能力更是横跨听、看、说&#xff0c;丝滑流畅毫无延迟&#xff0c;就像在打一个视频电话。 现场直播的效果更是炸裂&#xff1a; 它能感受到你的呼吸节奏&#xf…...

【优选算法】——Leetcode——202—— 快乐数

目录 1.题目 2. 题⽬分析: 3.简单证明&#xff1a; 4. 解法&#xff08;快慢指针&#xff09;&#xff1a; 算法思路&#xff1a; 补充知识&#xff1a;如何求⼀个数n每个位置上的数字的平⽅和。 总结概括 5.代码实现 1.C语言 2.C 1.题目 202. 快乐数 编写一个算法来…...

华大基因CEPO-尹烨说学习与生活

怎么去面对生活和事业中的不确定性&#xff1f; 尹烨说&#xff0c;人类能够对抗不确定性的唯一的办法是&#xff0c;去让自己充电。 主持人问他&#xff0c;“和你同年的也有很多人&#xff0c;他们也可能也在学习&#xff0c;你怎么就能够脱颖而出呢&#xff1f;” 他说&am…...

C#中json数据序列化和反序列化的最简单方法(C#对象和字符串的相互转换)

文章目录 将C#对象转换为json字符串Newtonsoft模块的安装用Newtonsoft将对象转换为json字符串 将json字符串转换为C#对象 将C#对象转换为json字符串 本介绍将基于C#中的第三方库Newtonsoft进行&#xff0c;因此将分为Newtonsoft模块的安装和使用两部分。该模块的优势在于只需要…...

logback 日志脱敏

工具类 CustomLogbackPatternLayoutEncoder.java import ch.qos.logback.classic.encoder.PatternLayoutEncoder;public class CustomLogbackPatternLayoutEncoder extends PatternLayoutEncoder {/*** 正则替换规则*/private LogbackReplaces replaces;/*** 使用自定义 MyLog…...

element-ui的表单中,输入框、级联选择器的长度设置

使用<el-col>控制输入框的长度 <el-form-item label"姓名" label-width"80px"><el-col :span"15"><el-input v-model"form.name" autocomplete"off"></el-input></el-col></el-form…...

深入了解 npm:Node.js 包管理工具详解

文章目录 一、npm 基本概念1.1 什么是 npm&#xff1f;1.2 package.json 文件 二、npm 常用命令2.1 初始化项目2.2 安装依赖2.2.1 安装单个包2.2.2 全局安装包2.2.3 安装开发依赖 2.3 移除依赖2.4 更新依赖2.5 查看已安装的包2.6 发布包 三、npm 高级用法3.1 使用 npm scripts3…...

记一次跨域问题

线上跨域问题&#xff0c;在自己配置确认没问题下&#xff0c;要及时找运维看看是不是nginx配置问题。 两个方面&#xff1a; 项目代码 nginx配置 SpringBoot 解决跨域问题的 5 种方案&#xff01; SpringBoot解决CORS跨域问题 SpringBoot-实现CORS跨域原理及解决方案...

在Ubuntu 24.04上从源码编译PETSc:一个给计算科学新手的保姆级避坑指南

在Ubuntu 24.04上从源码编译PETSc&#xff1a;一个给计算科学新手的保姆级避坑指南 第一次在Ubuntu上编译科学计算库的经历&#xff0c;往往像闯进了一个满是隐藏陷阱的迷宫。作为过来人&#xff0c;我完全理解当看到满屏红色错误提示时的无助感——那些神秘的configure参数、突…...

好写作AI:本科毕业论文的“通关秘籍制造机”

对于众多本科生而言&#xff0c;撰写毕业论文就像是一场艰难的“冒险之旅”&#xff0c;从选题时的迷茫&#xff0c;到内容创作的绞尽脑汁&#xff0c;再到格式调整的繁琐&#xff0c;每一步都充满挑战。不过别担心&#xff0c;好写作AI&#xff08;官网&#xff1a;https://ww…...

AI赋能开发:在快马平台让qun329数据处理更智能

在开发过程中&#xff0c;处理复杂数据是每个开发者都会遇到的挑战。最近我在做一个名为qun329的数据处理项目时&#xff0c;就遇到了数据异常检测、缺失值填充和性能优化等一系列问题。幸运的是&#xff0c;通过InsCode(快马)平台的AI辅助开发功能&#xff0c;这些问题都得到了…...

OpenMS终极指南:如何快速掌握专业质谱数据分析的完整方案

OpenMS终极指南&#xff1a;如何快速掌握专业质谱数据分析的完整方案 【免费下载链接】OpenMS The codebase of the OpenMS project 项目地址: https://gitcode.com/gh_mirrors/op/OpenMS 蛋白质组学、代谢组学、质谱数据分析、OpenMS开源平台、生物信息学工具 在生命科…...

二次封装ElementUI日期范围组件:打造带限制规则的Vue2 v-model响应式通用组件

二次封装ElementUI日期范围组件&#xff1a;打造带限制规则的Vue2 v-model响应式通用组件 在基于Vue2ElementUI的后台系统开发中&#xff0c;日期范围选择器是高频使用的表单组件。原生组件虽满足基础选择需求&#xff0c;但面对日期范围限制&#xff08;最长90天&#xff09;、…...

零基础入门UNet人脸融合:手把手教你搭建本地换脸工具

零基础入门UNet人脸融合&#xff1a;手把手教你搭建本地换脸工具 1. 项目介绍与环境准备 1.1 什么是UNet人脸融合 UNet人脸融合是一种基于深度学习的人脸合成技术&#xff0c;它能够将一张图片中的人脸特征自然地融合到另一张图片上。这项技术在影视特效、数字艺术创作、社交…...

打造纯净浏览环境:AdGuard浏览器扩展全方位部署与优化指南

打造纯净浏览环境&#xff1a;AdGuard浏览器扩展全方位部署与优化指南 【免费下载链接】AdguardBrowserExtension AdGuard browser extension 项目地址: https://gitcode.com/gh_mirrors/ad/AdguardBrowserExtension 一、核心优势解析&#xff1a;重新定义广告拦截技术标…...

3大核心功能解锁QtScrcpy:实现跨平台Android设备高效控制

3大核心功能解锁QtScrcpy&#xff1a;实现跨平台Android设备高效控制 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy QtScrcpy是一款开源的跨平台Android实时显示与控制工具&#x…...

HeidiSQL连接池管理终极指南:优化数据库性能的10个关键技巧

HeidiSQL连接池管理终极指南&#xff1a;优化数据库性能的10个关键技巧 【免费下载链接】HeidiSQL A lightweight client for managing MariaDB, MySQL, SQL Server, PostgreSQL, SQLite, Interbase and Firebird, written in Delphi and Lazarus/FreePascal 项目地址: https…...

Qwen3.5-9B-AWQ-4bit Java开发环境快速配置:从安装到第一个AI程序

Qwen3.5-9B-AWQ-4bit Java开发环境快速配置&#xff1a;从安装到第一个AI程序 1. 准备工作&#xff1a;你需要什么 在开始之前&#xff0c;确保你的电脑满足以下基本要求&#xff1a; 操作系统&#xff1a;Windows 10/11、macOS 10.15 或主流Linux发行版内存&#xff1a;至少…...