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

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

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

题目: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);
*/

完。

相关文章:

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

下题目为个人的刷题记录,在本节博客中我将详细谈论设计循环队列的思路,并给出代码,有需要借鉴即可。 题目:LINK 循环队列是线性表吗?或者说循环队列是线性结构吗? 对于这个问题,我们来看一下线…...

人工智能|机器学习——k-近邻算法(KNN分类算法)

1.简介 k-最近邻算法,也称为 kNN 或 k-NN,是一种非参数、有监督的学习分类器,它使用邻近度对单个数据点的分组进行分类或预测。虽然它可以用于回归问题,但它通常用作分类算法,假设可以在彼此附近找到相似点。 对于分类…...

乐得瑞 1C to 2C快充线:引领充电数据线新潮流,高效快充解决接口难题

随着科技的不断进步,数据线的接口种类也日渐繁多,但在早些时候,三合一和二合一的数据线因其独特的设计而备受欢迎。这类数据线通常采用USB-A口作为输入端,并集成了Micro USB、Lightning以及USB-C三种接口,满足了当时市…...

O2OA(翱途)开发平台如何在流程表单中使用基于Vue的ElementUI组件?

本文主要介绍如何在O2OA中进行审批流程表单或者工作流表单设计,O2OA主要采用拖拽可视化开发的方式完成流程表单的设计和配置,不需要过多的代码编写,业务人员可以直接进行修改操作。 在流程表单设计界面,可以在左边的工具栏找到Ele…...

0 OpenHarmony开源鸿蒙NEXT星河版内核嵌入式编程

开源鸿蒙NEXT星河版内核嵌入式编程 作者将狼才鲸创建日期2024-03-08 CSDN文章阅读地址Gitee文章下载地址 一、前景提要 2024年1月18日,华为放出HarmonyOS NEXT 鸿蒙星河版开发者预览版本(不是HarmonyOS NEXT版,是HarmonyOS NEXT星河版&…...

Vue | 基于 vue-admin-template 项目的跨域问题解决方法

目录 一、现存问题 二、解决方法 2.1 修改的第一个地方 2.2 修改的第二个地方 2.3 修改的第三个地方 自存 一、现存问题 报错截图如下: 二、解决方法 2.1 修改的第一个地方 在 .env.development 文件中: # base api # VUE_APP_BASE_API /d…...

mutex 和 channel 哪一个工作效率更高?

关于Rust中mutex和channel哪一个工作效率更高的问题,实际上并没有一个绝对的答案,因为效率的高低取决于具体的使用场景和需求。 互斥锁(mutex)主要用于保护共享资源,确保一次只有一个线程可以访问它。当需要多个线程同…...

Elasticsearch 通过索引阻塞实现数据保护深入解析

Elasticsearch 是一种强大的搜索和分析引擎,被广泛用于各种应用中,以其强大的全文搜索能力而著称。 不过,在日常管理 Elasticsearch 时,我们经常需要对索引进行保护,以防止数据被意外修改或删除,特别是在进…...

备考银行科技岗刷题笔记(持续更新版)

银行考试计算机部分复习 IEEE 802.11的帧格式 1.1 IEEE 802.11是什么? 802.11是国际电工电子工程学会(IEEE)为无线局域网络制定的标准。目前在802.11的基础上开发出了802.11a、802.11b、802.11g、802.11n、802.11ac。并且为了保证802.11更…...

代码随想录算法训练营第五十五天|583. 两个字符串的删除操作、72. 编辑距离。

583. 两个字符串的删除操作 题目链接:两个字符串的删除操作 题目描述: 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 解题思路: 1、确定dp数组&#x…...

Softmax 回归 + 损失函数 + 图片分类数据集【动手学深度学习v2】李沐动手学深度学习课程笔记

目录 Softmax回归 损失函数 图片分类数据集 Softmax回归从零开始实现 Softmax回归简洁实现 Softmax回归 回归和分类的区别 回归问题举例上节课的预测房价问题,分类问题就是对样本进行分类 回归和分类的具体区别 假设真实的类别为第i个类别(值为1&#x…...

git 初始化项目并上传到github

如果还没配置过,需要配置账号信息 git config --global user.name "baymax-collab" git config --global user.email "baymax-collabtest.com"创建一个新的存储库 git clone gitgithub.com:xxxx cd test git switch --create main touch READ…...

前端javascript的DOM对象操作技巧,全场景解析

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:前端泛海 景天的主页:景天科技苑 文章目录 1.js的DOM介绍2.节点元素层级关系3.通过js修改,清空节点…...

TCP包头、TCP为什么安全可靠、UDP和TCP的区别、http协议

我要成为嵌入式高手之3月8日Linux高编第十八天!! __________________________________________________ 学习笔记 TPC包头 1、序号 发送端发送数据包的编号 2、确认号 已经确认接收到的数据的编号,只有当ACK为1时,该位才有用 …...

Android使用WebView打开内嵌H5网页

Android打开外部网页链接请参考上一篇文章 https://public.blog.csdn.net/article/details/136384559 继上篇,新建assets文章夹,将H5的网页资源放到此文件夹下 把H5的资源文件都拷进来 这个时候,将添加打开本地网页的代码: //打…...

UDP实现文件的发送、UDP实现全双工的聊天、TCP通信协议

我要成为嵌入式高手之3月7日Linux高编第十七天!! ———————————————————————————— 回顾 重要程序 1、UDP实现文件的发送 发端: #include "head.h"int main(void) {int sockfd 0;struct sockaddr_i…...

Yocto - Project Quick Build

欢迎光临! 这篇简短的文档将向您介绍使用 Yocto 项目构建典型镜像的过程。本文还介绍了如何为特定硬件配置构建。您将使用 Yocto Project 构建一个名为 Poky 的参考嵌入式操作系统。 Welcome! This short document steps you through the process for a typical i…...

深入探讨C++中的可变参数列表(Variadic Templates)

文章目录 导言可变参数列表的基本用法使用std::initializer_list应用场景 导言 在C编程中,处理可变数量参数的能力是一种非常有用的功能。通过可变参数列表,你可以编写更加通用和灵活的函数,从而提高代码的可读性和重用性。本文将详细介绍C中…...

MS2548 国产自动方向控制、半双工 RS-485 收发器 替代MAX13487

MS2548 国产自动方向控制、半双工 RS-485 收发器 替代MAX13487 北京冠宇铭通科技有限公司 肖小姐 产品简述 MS2548 是一个 5V 供电、半双工 RS-485 收发器。 芯片具有自动换向控制功能,可用于隔离485 端口,驱动器输入与使能信号一起配合控制芯片的状态&…...

数据库大师之路:Oracle在线学习平台全指南!

介绍数据库是由甲骨文公司开发的一款关系数据库管理系统(RDBMS),在数据库领域具有领先地位,并且以其系统可移植性而闻名。以下是对Oracle数据库的详细介绍: 市场地位:Oracle数据库是目前世界上流行的关系数…...

NCE外汇:指尖战场还是桌面指挥中心?深入对比移动端与桌面版交易体验

在快节奏的外汇市场,交易者如同战场上的将领,需要随时洞察瞬息万变的行情,及时下达精确指令。选择合适的交易平台——“武器”和“指挥所”,至关重要。NCE外汇为广大投资者提供了功能强大的桌面平台和灵活便捷的移动应用。两者并非…...

React 与 Chrome 扩展开发:在内容脚本(Content Scripts)中注入 React UI 的生命周期挑战

React 与 Chrome 扩展开发:在内容脚本中注入 React UI 的生命周期挑战 各位听众,各位未来的(或者已经是)扩展开发大师们,大家好! 今天我们不谈那些陈词滥调,也不讲那些“Hello World”的入门教程…...

058.日志系统搭建:用Python logging模块记录训练全过程

从一次深夜调试说起 上周团队实习生跑了一夜YOLO训练,早上兴奋地跑来说mAP涨了5个点。我让他把训练曲线和关键日志给我看看,他愣了半天,最后掏出一堆print输出的txt文件,关键信息全混在终端输出里早被冲掉了。更头疼的是,当我想复现某个中间状态时,连当时的学习率、数据…...

避开GD32F103的‘软’坑:除了改延时,你的ADC+DMA配置真的对了吗?(附官方Demo对比心得)

GD32F103与STM32F103的ADCDMA配置差异深度解析 在MCU开发领域,GD32F103系列作为STM32F103的替代方案,因其优异的性价比获得了广泛应用。然而,许多开发者在移植过程中,尤其是涉及到ADC和DMA这类复杂外设时,往往会遇到各…...

用Simulink手把手搭建7自由度悬架模型:从方程到仿真的保姆级避坑指南

用Simulink手把手搭建7自由度悬架模型:从方程到仿真的保姆级避坑指南 在车辆动力学研究中,7自由度悬架模型是分析整车振动特性的黄金标准。不同于简单的四分之一车模型,它能同时捕捉车身垂向跳动、俯仰、侧倾以及四个车轮的独立运动&#xff…...

SAP S/4HANA Cloud 公有云实施:广州企业服务商选型与落地实践

随着数字化转型的深入推进,越来越多的广州企业开始关注SAP ERP公有云解决方案。相比传统本地部署,公有云版本具有部署周期短、运维成本低、弹性扩展灵活等优势,特别适合中大型企业快速构建数字化核心能力。为什么选择SAP ERP公有云&#xff1…...

别再折腾FFmpeg了!用SRS流媒体服务器搞定海康摄像头Web实时监控(GB28181协议)

基于SRS的GB28181协议摄像头Web实时监控实战指南 每次调试海康摄像头的实时监控功能时,总会遇到各种技术难题。传统方案依赖FFmpeg进行流转换,不仅配置复杂,延迟问题也让人头疼。最近在智慧园区项目中,我们成功用SRS流媒体服务器实…...

百度网盘SVIP破解终极指南:macOS免费解锁高速下载完整教程

百度网盘SVIP破解终极指南:macOS免费解锁高速下载完整教程 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘Mac版的龟速下载而…...

从Qt 5.7到C++17:一文搞懂qAsConst的来龙去脉与实战应用

从Qt 5.7到C17:深入解析qAsConst的设计哲学与工程实践 在Qt框架的演进历程中,qAsConst函数的引入标志着Qt与C标准的一次重要融合。这个看似简单的工具函数背后,蕴含着Qt容器设计哲学与C现代语法特性的精妙平衡。本文将带您穿越技术迷雾&#…...

告别拍脑袋!用Python+MindOpt搞定营销预算分配(附实战代码)

用PythonMindOpt实现营销预算智能分配的实战指南 当市场团队拿着季度预算发愁"钱该往哪儿花"时,数据科学的价值就体现在把决策从"凭感觉"升级为"看数据"。去年双十一前,我们团队接手了一个典型case:某母婴品牌…...