(leecode)设计循环队列

(温馨提示:这是博主最最喜欢的歌曲哦,没有之一) 


题目:

题解:

思路:

方法一(数组):

方法二(链表):


 题目:

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

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

你的实现应该支持如下操作: 

  • MyCircularQueue(k): 构造器,设置队列长度为 k 。
  • Front: 从队首获取元素。如果队列为空,返回 -1 。
  • Rear: 获取队尾元素。如果队列为空,返回 -1 。
  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满。

题解:

思路:

这里循环队列可以是使用链表实现,也可以是使用数组实现,两种方法这里都比队列长度k多开了一块空间,用来界定满和空,当两个指针相同时为NULL,当尾指针的下一个是头指针为满。


两种方法各有其优点和缺点:数组的Create方便一点,链表的麻烦;数组的尾元素和首元素计算和边界界定很麻烦,链表极简单;malloc出来的数组释放方便,链表麻烦,而且还需要一个指针prve记录尾指针的前一个,并在释放前将prve->next置为NULL使得释放容易。


至于选用哪种方式都是OK的,下面的两种方法leecode上都通过了,看各位自己选择。

方法一(数组):

typedef struct 
{int *Spade_A;int front;int rear;int kk;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) 
{MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->Spade_A = (int*)malloc(sizeof(int)*(k+1));obj->front = 0;obj->rear = 0;obj->kk = k;return obj;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) 
{return obj->front == obj->rear;
}bool myCircularQueueIsFull(MyCircularQueue* obj) 
{if(obj->front == (obj->rear + 1) % (obj->kk + 1))return true;elsereturn false;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) 
{if(myCircularQueueIsFull(obj))return false;else  obj->Spade_A[obj->rear] = value;obj->rear++;obj->rear %= (obj->kk+1);return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj))return false;elseobj->front++;obj->front %= (obj->kk+1);return true;
}int myCircularQueueFront(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->Spade_A[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->Spade_A[(obj->rear + obj->kk)%(obj->kk+1)];
}void myCircularQueueFree(MyCircularQueue* obj) 
{free(obj->Spade_A);obj->front = obj->rear = 0;obj->kk = 0;free(obj);
}

 方法二(链表):


typedef struct List
{int data;struct List* next;
}List;typedef struct 
{List *head;List *tail;List *prve;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) 
{MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->head = NULL;obj->tail = NULL;obj->prve = NULL;k++;while(k--){List* newnode = (List*)malloc(sizeof(List));newnode->next = NULL;if(obj->head == NULL){obj->head = obj->tail = newnode;}else{obj->tail->next = newnode;obj->tail = newnode;}}obj->tail->next = obj->head;obj->tail = obj->head;return obj;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) 
{return obj->head == obj->tail;
}bool myCircularQueueIsFull(MyCircularQueue* obj) 
{return obj->tail->next == obj->head;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) 
{if(!myCircularQueueIsFull(obj)){obj->prve = obj->tail;obj->tail->data = value;obj->tail = obj->tail->next;return true;}elsereturn false;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj)){return false;}else{obj->head = obj->head->next;return true;}
}int myCircularQueueFront(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj)){return -1;}return obj->head->data;
}int myCircularQueueRear(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj)){return -1;}return obj->prve->data;
}void myCircularQueueFree(MyCircularQueue* obj) 
{obj->prve->next = NULL;List* cur = obj->tail;while(cur){List *next = cur->next;free(cur);cur = next;}obj->head = NULL;obj->tail = NULL;obj->prve = NULL;free(obj);
}


Lei宝啊的主页: 呐呐,点这里哦

愿所有美好不期而遇

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

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

相关文章

MATLAB|信号处理的Simulink搭建与研究

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

PostgreSQL技术沙龙|PPT合集速来下载

新机遇,新态势,新发展 2023年8月5日,由中国开源软件推进联盟PG分会(中国PG分会)联合杭州云贝教育共同举办的“PostgreSQL技术沙龙杭州站”圆满举行。本次活动结合当下去O、国产化趋势,邀请社群技术专家围…

服务器数据恢复-断电导致ext4文件系统文件丢失的数据恢复案例

服务器数据恢复环境: 一台服务器挂载一台存储设备,存储中划分一个Lun;服务器操作系统是Linux centos,EXT4文件系统。 服务器故障&分析: 意外断电导致服务器操作系统无法启动,系统在修复后可以正常启动&…

C语言函数详解(1)

目录 函数是什么 C语言中函数的分类 库函数 自定义函数 函数的参数 实际参数(实参) 形式参数(形参) 函数的调用 传值调用 传址调用 练习 函数的嵌套调用和链式访问 嵌套调用 链式访问 函数是什么 数学中我们常见到函…

揭秘浏览器键入URI到页面显示的过程: 浏览器键入URI,到页面显示,中间发生什么?

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

TypeScript学习笔记

1.ts和js的区别 2. ts的优势 3. ts下载后报错解决方法 报错: PS C:\Users\\Desktop> tsc -v tsc : 无法加载文件 C:\Users\32173\AppData\Roaming\npm\tsc.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/ go.microsoft.com/fwlink/?…

【LeetCode每日一题】——205.同构字符串

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 简单 三【题目编号】 205.同构字符串 四【题目描述】 给定两个字符…

资深媒体人宋繁银加入《数据猿》任总编辑,全面负责公司整体内容工作

大数据产业创新服务媒体 ——聚焦数据 改变商业 2023年7月北京,《数据猿》宣布正式任命宋繁银为总编辑,全面负责公司整体内容工作。此次重要的人事任命标志着《数据猿》的发展迈上了一个新的台阶,对于《数据猿》团队而言,不仅是一…

redis的事务和watch机制

这里写目录标题 第一章、redis事务和watch机制1.1)redis事务,事务的三大命令语法:开启事务 multi语法:执行事务 exec语法:取消事务 discard 1.2)redis事务的错误和回滚的情况1.3)watch机制语法&…

VS Code安装使用教程

目录 1. VS Code是什么? 2. VS Code的下载和安装 下载: 安装: 2.2 环境的介绍 3. VS Code配置C/C开发环境 3.1 下载和配置MinGW-w64编译器套件 下载: 配置: 3.2 安装C/C插件 3.3 重启VSCode 4. 在VSCode上编…

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计)

文章目录 1. 主要的窗体类及其用途2. 窗体类重要特性的设置2.1 setAttribute()函数2.2 setWindowFlags()函数2.3 setWindowState()函数2.4 setWindowModality()函数2.5 setWindowOpacity()函数 3. 多窗口应用程序设计3.1 主窗口设计3.2 QFormDoc类的设计3.3 QFormDoc类的使用3.…

linux自定义网络访问规则

1.更改防火墙默认区域为trusted firewall-cmd --set-default-zonetrusted 2.新建一个zone,将想要访问本机80端口的ip,如:192.168.3.99 ,添加的这个zone中,同时在这个zone中放行80端口。 firewall-cmd --permanent --ne…

node配置Web 服务器

1、什么是 Web 服务器 Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,Web服务器的基本功能就是提供Web信息浏览服务。 它只需支持HTTP协议、HTML文档格式及URL,与客户端的网络浏览器配合。 大多数 web 服务器都支持服…

Javascript 正则

基本语法 定义 JavaScript种正则表达式有两种定义方式 构造函数 var regnew RegExp(<%[^%>]%>,g);字面量 var reg/<%[^%>]%>/g;g&#xff1a; global&#xff0c;全文搜索&#xff0c;默认搜索到第一个结果接停止i&#xff1a;ingore case&#xff0c;忽略…

接口自动化测试框架及接口测试自动化主要知识点

接口自动化测试框架&#xff1a; 接口测试框架&#xff1a;使用最流行的Requests进行接口测试接口请求构造&#xff1a;常见的GET/POST/PUT/HEAD等HTTP请求构造 接口测试断言&#xff1a;状态码、返回内容等断言JSON/XML请求&#xff1a;发送json\xml请求JSON/XML响应断言&…

绝了!工业配电柜看这篇就够了!

随着工业自动化的不断发展&#xff0c;电力作为生产的重要支撑&#xff0c;其稳定性、安全性和高效性变得尤为重要。 配电柜作为电力系统的核心组成部分&#xff0c;其监控不仅关乎生产的连续性&#xff0c;也涉及员工和设备的安全。通过实时监测、数据采集和分析&#xff0c;工…

Linux 上安装部署Nacos

标题&#xff1a;在Linux上安装和部署Nacos Nacos是一个开源的分布式服务发现和配置管理平台&#xff0c;它可以帮助开发人员实现微服务架构中的服务注册、发现和动态配置管理。 步骤1&#xff1a;准备工作 在开始安装Nacos之前&#xff0c;确保您已经具备以下条件&#xff1…

Mongoose http server 例子

今天抽了点时间看了一下 mongoose的源码&#xff0c; github 地址&#xff0c;发现跟以前公司内部使用的不太一样&#xff0c;这里正好利用其 http server 例子来看一下。以前的 http message 结构体是这样的&#xff1a; /* HTTP message */ struct http_message {struct mg_…

css的transform样式计算-第一节

本文作者为 360 奇舞团前端开发工程师 引言 在使用 css 样式进行样式的缩放、旋转等设置时&#xff0c;思考了一下它的较浅层的原理&#xff0c;恩&#xff0c;这个阶段都 是一些初高的数学计算&#xff0c;从新看这里的时候顺便捡了捡初高中的数学&#xff0c;比如三角函数之类…

CSS:盒子模型 与 多种横向布局方法

目录 盒子模型块级盒子内联级盒子内联块级盒子弹性盒子display 改变模型区域划分text 内容区padding 填充区border 边框区margin 外边距直接设置盒子大小 布局横向布局方法一 float 浮起来方法二 内联块级元素实现方法三 弹性盒子模型 盒子模型 块级盒子 独占一行&#xff0c…