数据结构OJ:设计循环队列

题目介绍

题目介绍
本题为LeetCode上的经典题目,题目要求我们设计一种循环队列,满足FIFO原则且队尾被连接在队首之后。

思路讲解

题目中介绍循环队列的好处是可以重复利用空间,所以我们很容易想到在初始化时即开辟指定大小的空间,之后便不需要再开辟空间,只需后续销毁即可。

首先我们要选择使用顺序表还是使用链表来实现循环队列,那么我们先对比一下两种方式的优缺点。

使用顺序表的优点主要在开辟空间方便,但缺点就是顺序表的删除元素效率很低,这也是链表相比于顺序表最大的优势,但只要我们稍加思考,就会发现这道题目中顺序表的缺点可以被完美避免,我们可以定义两个整形元素,一个指向队首,一个指向队尾(后文称为头指针和尾指针,虽然我们定义的是整型,但是在顺序表中,可以配合数组的索引,来实现指针的效果),如果需要出队列,我们只需让头指针+1,就可以不必移动后续数据而打到头删的效果,这种方法的实现得益于我们开头的分析:循环队列可以重复利用空间,我们让头指针+1后,原来头指针所指向的空间我们并不需要销毁,也不需要改变其中的内容,因为后续我们添加元素会将其覆盖。

使用链表的优点在于出队列和入队列很方便(即头删和尾插),所以大多数人一看到题目首先想到的就是使用链表来实现,但我们分析一下使用链表的缺点,就会发现,使用链表实现这道题会非常复杂。使用链表的缺点就是我们很难判断队列是已满还是为空,因为当头指针和尾指针相同时,可能是队列已满,也可能是队列为空。

通过以上分析,我们选择使用顺序表来实现循环队列。那么具体细节该如何实现呢?

此题的最优解为我们在创建顺序表时,数组的大小创建为(k + 1)的大小,让头指针指向第一个元素,尾指针指向最后一个元素的下一个空间,这样当头指针和尾指针指向相同时,代表头指针追上了尾指针,即队列为空;在结构体中定义一个整形元素,来记录数据的个数,当数据个数==k时,队列已满。

参考代码

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

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

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

相关文章

策略模式:灵活调整算法的设计精髓

在软件开发中,策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。通过定义一系列算法,并将每个算法封装起来,策略模式使得算法可以互换使用,这使得算法可以独立于使用它们的客户。本文将详细介绍策略模式的…

【小贪】大数据处理常用:Pyspark, Pandas

近期致力于总结科研或者工作中用到的主要技术栈,从技术原理到常用语法,这次查缺补漏当作我的小百科。主要技术包括: ✅数据库常用:MySQL, Hive SQL, Spark SQL✅大数据处理常用:Pyspark, Pandas⚪ 图像处理常用&#…

【每日刷题】Day16

【每日刷题】Day16 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 24. 两两交换链表中的节点 - 力扣(LeetCode) 2. 160. 相交链表 - 力扣&…

基于小程序实现的4s店管理系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:ssm 【…

【C++11】智能指针

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:理解在C11中智能指针,自己能模拟实现 4 种智能指针 > 毒鸡汤:白日莫闲过,青春不再来。 > 专栏选自&#xff1…

【halcon】C# halcon 内存暴增 续,找到一个解决方案

这里写自定义目录标题 背景释放临时缓存具体的使用感受背景 在之前的文章《【halcon】C# halcon 内存暴增 》中我们提到了一些会导致内存暴增的原因。 其中一个就是使用了计算复杂的算子,且图片很大时,此时内存就会暴增,而且内存无法被释放。 这次,我在做一个项目时,用到…

深入理解负载均衡:原理及常用算法

摘要: 负载均衡在现代网络架构中扮演着至关重要的角色,它通过分配请求到多个服务器来提高系统的性能、可用性和可伸缩性。本文将介绍负载均衡的基本原理以及常用的负载均衡算法,帮助读者更好地理解和应用负载均衡技术。 引言 随着互联网的迅…

TP5使用group报错:1055 Expression #1 of SELECT list is not in GROUP

使用group报错 Mysql环境是5.7的, 使用了View进行了表连接, 进行了表连接 搬迁到本地后, 查询报错 Syntax error or access violation: 1055 Expression 解决方法1 配置 my.cnf(linux)文件 win下面是 mysql.ini文件 在 mysqld 里加上 sql_modeNO_ENGINE_SUBSTITUTION,STR…

L2-3 完全二叉树的层序遍历

完全二叉树的层序遍历 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全…

网络爬虫:定义、应用及法律道德考量

网络爬虫技术在当今数据驱动的世界中发挥着重要作用。本文将从网络爬虫的定义和主要功能,其在业界的应用实例,以及涉及的法律和道德问题三个方面进行深入探讨。 1. 爬虫的定义和主要功能 网络爬虫,也称为网页爬虫或蜘蛛,是一种…

RocketMQ 01 Linux安装

RocketMQ 01 主要内容: 编译安装HelloWorld官网名词 官方网站 http://rocketmq.apache.org GitHub https://github.com/apache/rocketmq Quick Start Linux下使用Maven编译源码安装 Rocketmq4.6需要jdk1.8环境编译和运行 各版本要求 VersionClientBroke…

SGI_STL和Nginx内存池源码剖析--源码移植

将SGISTL内存配置器和Nginx内存池源码,移植到自己的项目中。 源码文件复杂,并且有很多项目中使用不到的宏定义,所以通过改写和移植,可以很好的适应C的其他项目。 SGI-STL源码移植资源-CSDN文库 nginx内存池源码移植资源-CSDN文库…

游戏动画技术:从传统到深度学习

一、传统游戏动画技术简介 3D游戏动画的骨骼动画和蒙皮技术动画交互控制:状态机、动作融合和IK基于状态机的动画控制原理和问题 二、Motion Matching技术简介 传统状态机动画的缺陷Motion Matching的原理:根据角色状态自动匹配动画Dance Card动捕流程…

android不同版本(支持>10)获取当前连接的wifi名称

1、AndroidManifest.xml 配置权限 <uses-permission android:name"android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name"android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name&q…

《大话数据结构》02 算法

算法是解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 1. 两种算法的比较 大家都已经学过一门计算机语言&#xff0c;不管学的是哪一种&#xff0c;学得好不好&#xff0c;好歹是可以写点小程序了。现在…

MySQL事务(学习)

1.事务的特性是什么&#xff1f; 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 事务包含了4个特性ACID 事务4个特性…

开发需求总结14-数组对象中根据相同的id进行排序

需求描述: 大家都知道element里el-table组件实现单选、全选,只需要在el-table-column,设type属性为selection,通过selection-change事件就可以得到选中的数组。一般像批量发布、批量审批、批量拒绝等场景,不涉及选中后排序,是可以直接将选中后的数据的id作为参数,传递给…

windows编译xlnt,获取Excel表里的数据

用git拉取项目 这个文件是空的 要用git拉下来&#xff0c;使用终端编译xlnt库 点击解决方案 运行生成 然后新建项目&#xff0c;配置好库&#xff0c; #include <iostream> #include <xlnt/xlnt.hpp>int main() {// 打开 Excel 文件xlnt::workbook workbook;workb…

优斯特:防静电包装解决方案的巧妙运用

在现代电子产品生产与运输领域&#xff0c;防静电包装已成为保障产品安全的必备环节。优斯特凭借其创新的防静电包装解决方案&#xff0c;为客户提供了一种巧妙的方式来确保产品在存储和运输过程中不受静电影响&#xff0c;并且不会被刮花或损坏。 静电对产品的影响 静电对电子…

大数据行业英语单词巩固20240413

Integration - 整合 Example: The integration of new software into our system will improve efficiency. 示例&#xff1a;将新软件集成到我们的系统中将提高效率。 Automation - 自动化 Example: Automation of repetitive tasks can save time and reduce errors. 示例&a…