【刷题记录】详谈设计循环队列

下题目为个人的刷题记录,在本节博客中我将详细谈论设计循环队列的思路,并给出代码,有需要借鉴即可。

题目:LINK
在这里插入图片描述
循环队列是线性表吗?或者说循环队列是线性结构吗?
对于这个问题,我们来看一下线性结构的定义:
在这里插入图片描述
因为循环队列结点个数为k个,且具有逻辑结构性,因此属于一种特殊的线性结构

下面是思路分析:
首先一开始收到实现普通队列的思路影响+上题目中循环这俩字,那自然想到的是用链表来设计循环队列。
于是,为了便于分析我作了下面的草图:
在这里插入图片描述
现在我们一开始迎来了第一个问题:我们的头指针和尾指针初始化放到哪里?
为了解决这个问题,我想到了第一个方法:初始化头指针尾指针置为空
这个方法看似很好,但是结合一下我们要实现的接口,判空时候需要做特殊处理,其实并不是很好。
在这里插入图片描述
然后我又想到,那让他们一开始直接都指向第一个结点
我们继续往下想,如果这样做的化,还是那个问题,如何区分空队列与一个结点的情况?
在这里插入图片描述
那么为了解决这个区分问题,我们可以引入size来统计结点个数
在这里插入图片描述
不过这里还有个问题,如果front与rear初始化指向第一个结点,然后引入size来区分结点个数的话,我们发现rear是指向尾结点的后一个结点的,也就是说我们在搞取尾接口的时候并不好操作,因为这是单向链表。
在这里插入图片描述
那为了解决取尾接口问题,我们要把单链表改成双向链表
但是这样一来,工作量就要变大很多,并不是很好的选择。
所以,不妨我们来用一下数组:
1.为了解决两个指针一开始都指向第一个空间特殊处理的问题,所以我们选择rear指向尾结点的后一个结点
2.为了解决不好判断的问题,我们多开一个空间,用rear+1 == front 为满的条件
3.为了解决数组循环问题,我们可以取模

下面是示例代码:


typedef struct {int front;//头元素int rear;//尾元素的下一个int* arr;//数组指针int k;
} MyCircularQueue;//检查循环队列是否为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {if(obj->front == obj->rear){return true;}else{return false;}
}bool myCircularQueueIsFull(MyCircularQueue* obj) {if((obj->rear+1)%(obj->k+1)==obj->front){return true;}else{return false;}
}//构造器,设置队列长度为 k 
MyCircularQueue* myCircularQueueCreate(int k) {//首先创造出一个MyCircularQueue结构体,为方便操作数组做铺垫MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));//数组空间申请+初始化结构体obj->arr = (int*)malloc((k+1)*sizeof(int));obj->k = k;obj->front = obj->rear = 0;//返回结构体指针return obj;
}//向循环队列插入一个元素。如果成功插入则返回真
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {//满了if(myCircularQueueIsFull(obj)){return false;}else//没满{obj->arr[obj->rear++] = value;//放入数据并移动尾指针obj->rear = obj->rear % (obj->k+1);//循环return true;}
}
//从循环队列中删除一个元素。如果成功删除则返回真
bool myCircularQueueDeQueue(MyCircularQueue* obj) {//空的if(myCircularQueueIsEmpty(obj)){return false;}else//非空{obj->front++;obj->front %= (obj->k+1);return true;}
}//从队首获取元素。如果队列为空,返回 -1 
int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))//为空{return -1;}else//非空{return obj->arr[obj->front];}
}//获取队尾元素。如果队列为空,返回 -1 
int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))//为空{return -1;}else{int prear = ((obj->rear + obj->k)%(obj->k+1));return obj->arr[prear];}
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->arr);free(obj);
}/*** Your MyCircularQueue struct will be instantiated and called as such:* MyCircularQueue* obj = myCircularQueueCreate(k);* bool param_1 = myCircularQueueEnQueue(obj, value);* bool param_2 = myCircularQueueDeQueue(obj);* int param_3 = myCircularQueueFront(obj);* int param_4 = myCircularQueueRear(obj);* bool param_5 = myCircularQueueIsEmpty(obj);* bool param_6 = myCircularQueueIsFull(obj);* myCircularQueueFree(obj);
*/

完。

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

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

相关文章

【Linux进阶之路】网络 —— “?“ (下)

文章目录 前言一、概念铺垫1.TCP2.全双工 二、网络版本计算器1. 原理简要2. 实现框架&&代码2.1 封装socket2.2 客户端与服务端2.3 封装与解包2.4 请求与响应2.5 对数据进行处理2.6 主程序逻辑 3.Json的简单使用 总结尾序 前言 在上文我们学习使用套接字的相关接口进行了…

面试经典150题(108-110)

leetcode 150道题 计划花两个月时候刷完之未完成后转,今天(第3天)完成了3道(108-110)150 108.(201. 数字范围按位与) 题目描述: 给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数…

Tomcat的安装

下载Tomcat(这里以Tomcat8.5为例) 直接进入官网进行下载,Tomcat官网 选择需要下载的版本,点击下载这里一定要注意:下载路径一定要记住,并且路径中尽量不要有中文!!!&…

怎么把视频变成gif动图?一招在线生成gif动画

MP4是一种常见的视频文件格式,它是一种数字多媒体容器格式,可以用于存储视频、音频和字幕等多种媒体数据。MP4格式通常用于在计算机、移动设备和互联网上播放和共享视频内容。要将MP4视频转换为GIF格式,您可以使用专门的视频转gif工具。这个工…

三款顶级开源RAG (检索增强生成)工具:Verba、Unstructured 和 Neum

三款顶级开源RAG (检索增强生成)工具:Verba、Unstructured 和 Neum 概述 随着企业对话式数据处理需求的提升,面临的挑战是数据隐私性和缺乏企业级解决方案。虽然类似LangChain能在短时间内构建RAG应用,但忽视了文档解析、多来源数据ETL、批量…

Python 对Excel工作表中的数据进行排序

在Excel中,排序是整理数据的一种重要方式,它可以让你更好地理解数据,并为进一步的分析和报告做好准备。本文将介绍如何使用第三方库Spire.XLS for Python通过Python来对Excel中的数据进行排序。包含以下三种排序方法示例: 按数值…

【洛谷 P8723】[蓝桥杯 2020 省 AB3] 乘法表 题解(数学+进制转换+字符串)

[蓝桥杯 2020 省 AB3] 乘法表 题目描述 九九乘法表是学习乘法时必须要掌握的。在不同进制数下,需要不同的乘法表。 例如, 四进制下的乘法表如下所示: 1*11 2*12 2*210 3*13 3*212 3*321请注意,乘法表中两个数相乘的顺序必须为样例中所示的…

从0开始的 Vue 生活

Vue 一、配置环境1.1 安装node.js1.1.1 node.js 下载1.1.2 node.js 安装1.1.3 node.js 配置 1.2 安装VSCode1.2.1 VSCode 下载1.2.2 VSCode 安装1.2.3 VSCode 配置 二、创建Vue项目2.1 使用命令行创建Vue项目2.2 使用VSCode运行Vue项目2.3 尝试编写Vue项目2.3.1 准备工作2.3.2 …

线性代数笔记14--投影

1. 一维空间投影 p X A e B − p B − X A A ⊤ e 0 A ⊤ ( B − X A ) 0 X A ⊤ A A ⊤ B X A ⊤ B A ⊤ A p X A A A ⊤ B A ⊤ A pXA\\ eB-pB-XA\\ A^{\top}e0\\ A^{\top}(B-XA)0\\ XA^{\top}AA^{\top}B\\ X\frac{A^{\top}B}{A^{\top}A}\\ pXAA\frac{A^{\top}B}{A^…

Java开发与配置用到的各类中间件官网

开发配置时用到了一些官网地址,记录一下。 activemq 官网:ActiveMQ elk 官网:Elasticsearch 平台 — 大规模查找实时答案 | Elastic nginx 官网:nginx maven 官网:Maven – Welcome to Apache Maven nexus 官网&a…

Zoom软件怎么购买?zoom付费订阅教程

首先,让我们来了解一下Zoom的各个版本以及它们的价格。简单来说,Zoom分为免费版和收费版,收费版又包括专业版、商业版和企业版。 一、免费版 Zoom的免费版功能已经非常实用了,适合个人用户和小团队使用。免费版提供以下功能: 最多…

centos7 python3.12.1 报错 No module named _ssl

https://blog.csdn.net/Amio_/article/details/126716818 安装python cd /usr/local/src wget https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz tar -zxvf Python-3.12.1.tgz cd Python-3.12.1/ ./configure -C --enable-shared --with-openssl/usr/local/opens…

小程序学习

一、第一天 1、小程序体验 2、注册账号 小程序 (qq.com) 3、开发工具下载 下载 / 稳定版更新日志 (qq.com) 4、目录结构 "navigationBarBackgroundColor": "#00b26a" 配置头部背景色 4、wxml模板介绍 5、wxss 6、js文件 7、宿主环境 1、通信主体 2…

spring boot 2.4.x 之前版本(对应spring-cloud-openfeign 3.0.0之前版本)feign请求异常逻辑

目录 feign SynchronousMethodHandler 第一部分 第二部分 第三部分 spring-cloud-openfeign LoadBalancerFeignClient ribbon AbstractLoadBalancerAwareClient 在之前写的文章配置基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 因为从 spring …

Java --- springcloud之consul

目录 一、consul的使用 1.1、主要功能 1.2、安装及运行 1.3、添加微服务到consul 1.3.1、8001微服务添加相关pom、配置文件、注解 1.3.2、80微服务添加相关pom、配置文件、注解 1.4、三个注册中心异同 1.5、consul进行分布式配置 1.5.1、修改8001的yml配置文件 1.5.2…

Ubuntu中如何卸载软件

在Ubuntu系统中要干净地卸载软件,意味着不仅移除软件本身,还包括它的配置文件以及可能存在的依赖关系。以下是几种确保干净卸载的方法: 方法1:使用apt-get 通过命令行进行卸载,这是最常用且能处理依赖关系的方式&…

运维知识点-Apache HTTP Server

Apache 介绍 介绍 Apache是一个开源的Web服务器软件,全称为Apache HTTP Server,由Apache软件基金会开发和维护。它是目前全球使用最广泛的Web服务器软件之一,占全球所有网络服务器的很大比例。Apache服务器具有跨平台的特性,可以…

python中try-except-finally简介及用法

什么是try-except-finally? try-except-finally是python中的一个语句,它用于处理可能发生的异常(错误),并在异常发生后执行一些必要的操作。它由三个部分组成: try:尝试执行一段可能发生异常的…

最简k8s部署(AWS Load Balancer Controller使用)

问题 我需要在k8s集群里面部署springboot服务,通过k8s ingress访问集群内部的springboot服务,应该怎么做? 这里假设已经准备好k8s集群,而且也准备好springboot服务的运行镜像了。这里我们将精力放在k8s服务编排上面。 一图胜千言…

Github 2024-03-09 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-09统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Python项目1Scala项目1CUE项目1InfluxDB Edge: 开源实时时序数据库 创建周期:3817 天开发语言:Rust协议类型:Apache License 2.0S…