数据结构(初阶4)---循环队列详解

循环队列

  • 1.循环队列的结构
    •   1).逻辑模式
  • 2.实现接口
    •   1).初始化
    •   2).判断空和满
    •   3).增加
    •   4).删除
    •   5).找头
    •   6).找尾
  • 3.循环队列的特点

1.循环队列的结构

  1).逻辑模式

请添加图片描述

与队列是大同小异的,
其中还是有一个指向队列头的head指针,
也有一个指向尾巴的tail指针

  不同之处在于它是一个环状的结构,通过增删的操作,
headtail的相对位置与实际位置都在时刻发生改变

2.实现接口

  1).初始化

typedef struct {int *_queue;int _size;int _tail;int _head;} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue *ret=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));ret->_queue=(int*)malloc(sizeof(int)*(k+1));ret->_size=k+1;ret->_tail=0;ret->_head=0;return ret;
}

 初始设置tailhead都是int类型的偏移量,而非指针
(非常关键,对于后续实现循环结构有重大作用)
queue就是我们的队列,k就是我们的初始化大小。
ps:我们这边不去使用动态增加

  2).判断空和满

接下来我们来理解一下其中的逻辑:>

如果我们的tailhead 都在移动,那是不是只要head == tail就代表我们的循环队列装满了。

答案是错错错!!!!!!!!!!!!!!!!!!!!!
在这里插入图片描述

我们来举一个反例:
请添加图片描述
那么我们该怎样去实现呢:>
我们可以建立一个空的区域不存放任何东西,让它成为一个间隔点
理解如下:
请添加图片描述

为什么我们要%(obj->_size)呢
因为如果我们的tail大于了size时会进入循环,此时我们%(obji->_size)就让tail的偏移量回到了前面,不会造成溢出。

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->_tail==obj->_head;
}
//若空则返回真bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->_tail+1)%(obj->_size)==obj->_head;
}
//若满则返回真

  3).增加

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj)){return false;}*(obj->_queue+((obj->_tail)%(obj->_size)))=value;(obj->_tail)++;obj->_tail%=obj->_size;return true;
}

同理,我们这边使用%(obj->_size),也是为了纠正偏移量

  4).删除

bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)){return false;}(obj->_head)++;obj->_head%=obj->_size;return true;
}

  5).找头

int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)){return -1;}return *(obj->_queue+((obj->_head)%(obj->_size)));
}

  6).找尾

int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)){return -1;}if(obj->_tail!=0){return *(obj->_queue+((obj->_tail-1)%(obj->_size)));}else{return *(obj->_queue+obj->_size-1);}
}

找尾这里有一个陷阱,如果我们的 tail0。
那么我们还能用 *(obj->_queue+((obj->_tail-1)%(obj->_size))); 去寻尾吗,显然不行,因为会造成溢出。
所以:
我们先判断,再然后如果
0,我们就直接返回相对 _queue 的末尾的值。
在这里插入图片描述

3.循环队列的特点

1.充分的利用了空间,不会产生普通队列频繁增删导致前面空间的浪费
2.循环复用空间提升了空间利用率。
3.需要固定大小的缓冲区场景(生产者消费者问题…)
4.操作的复杂度仅仅只有O(1)!!!

创作不易恳请留一个赞吧qwq

在这里插入图片描述

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

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

相关文章

Qwen2.5-Coder-32B-Instruct Docker 部署openai接口

Qwen2.5-Coder-32B-Instruct 模型下载,国内快捷方式: conda create -n modelscope python=3.10 conda activate modelscopepip install modelscopemodelscope download --model Qwen/Qwen2.5-Coder-32B-Instruct --local_dir /ssd/xiedong/Qwen/Qwen2.5-Coder-32B-I

图形几何之美系列:二维凸包艺术赏析

“凸包是计算几何中的概念,凸包在多个领域中有广泛的应用,主要包括几何计算、图形处理、优化问题、路径规划等。” 1.前言 凸包话题包括二维凸包、三维凸包以及高维凸包。对于平面点集,探究如何构造可以覆盖给定点集最小的凸多边形&#xff1…

速通前端篇 —— HTML

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:速通前端 目录 HTML的介绍 如何创建HTML文件 HTML 文件基本结构 HTML常用标签 title标签 标题标签 h1-h6 段落标签 p 换行标签 b…

shell编程--永久环境变量和字符串显位

环境变量 echo $HOME 在终端输出后会显示家目录有个root变量 我们会提出个疑问为什么平时我们在终端输入sl 或者which等等命令会输出一些内容呢,这是因为这些命令都有对应的环境变量。 我们查看一下环境变量 在终端输入: echo $PATH 我们看一下输出…

Python毕业设计选题:基于django+vue的二手物品交易系统

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 店铺管理 二手物品管理 广告管理 留言反馈 订单…

Spring:bean的配置

对于bean的配置中,主要会讲解bean基础配置,bean的别名配置,bean的作用范围配置(重点),这三部分内容: bean基础配置 id与class配置 bean的name属性 bean的别名配置 bean作用范围scope配置 scope使用后续思考 介绍完scope属性以后,我们…

前端无感刷新token

摘要: Axios 无感知刷新令牌是一种在前端应用中实现自动刷新访问令牌(access token)的技术,确保用户在进行 API 请求时不会因为令牌过期而中断操作 目录概览 XMLHttpRequestAxiosFetch APIJQuni.request注意事项: 访问…

图形 2.6 伽马校正

伽马校正 B站视频:图形 2.6 伽马校正 文章目录 伽马校正颜色空间传递函数 Gamma校正校正过程为什么需要校正?CRT与转换函数 为什么sRGB在Gamma 0.45空间? 人对亮度的敏感韦伯定律中灰值 线性工作流不在线性空间下进行渲染的问题统一到线性空…

【redis】—— 环境搭建教程

上一节,我们大致了解了Redis的几个重要版本,在本教程中,我们选择了5.0版本,因为5.0已经具备了大部分的功能特性,并且与7.0版本相比,其安装使用过程更为简便。 Redis的官方并不直接支持微软的Windows操作系统…

Springboot采用jasypt加密配置

目录 前言 一、Jasypt简介 二、运用场景 三、整合Jasypt 2.1.环境配置 2.2.添加依赖 2.3.添加Jasypt配置 2.4.编写加/解密工具类 2.5.自定义加密属性前缀和后缀 2.6.防止密码泄露措施 2.61.自定义加密器 2.6.2通过环境变量指定加密盐值 总结 前言 在以往的多数项目中&#xff0…

【机器学习导引】ch6-支持向量机

参考链接 【数之道】支持向量机SVM是什么,八分钟直觉理解其本质 间隔与支持向量 **问题引入:**在样本空间中寻找一个超平面,将不同类别的样本分类 超平面:在支持向量机中,模型的目标是找到一个能够分开不同类别的平…

详解map与multimap容器

目录 一、map简介 1.map构成 2.map本质 3.map的优点 4.map和multimap区别:map不允许容器中有重复key值元素。multimap允许容器中有重复key值元素。 5.map的构建 6.map的赋值 1️⃣赋值法 2️⃣拷贝赋值法 7.map的成员函数 (1)inse…

PyAEDT:Ansys Electronics Desktop API 简介

在本文中,我将向您介绍 PyAEDT,这是一个 Python 库,旨在增强您对 Ansys Electronics Desktop 或 AEDT 的体验。PyAEDT 通过直接与 AEDT API 交互来简化脚本编写,从而允许在 Ansys 的电磁、热和机械求解器套件之间无缝集成。通过利…

ubuntu将firewall-config导出为.deb文件

firewall-config ubuntu是canonial 公司维护的,用wireshark测过,开机会给他们公司发遥测(开了ufw阻塞所有连接也一样,canonial在里面把代码改了)firewall-config是fedora(爱好者维护,公益版本)自带的防火墙…

LLMs之Code:Qwen2.5-Coder的简介、安装和使用方法、案例应用之详细攻略

LLMs之Code:Qwen2.5-Coder的简介、安装和使用方法、案例应用之详细攻略 导读:这篇论文介绍了Qwen2.5-Coder系列模型,这是一个针对代码生成的强大开源大型语言模型。 >> 背景痛点:现有代码大型语言模型的不足:虽然…

H3C NX30Pro刷机教程-2024-11-16

H3C NX30Pro刷机教程-2024-11-16 ref: http://www.ttcoder.cn/index.php/2024/11/03/h3c-nx30pro亲测无需分区备份 路由器-新机初始化设置路由器登录密码telnet进入路由器后台 刷机上传uboot到路由器后台在Windows环境下解压后的软件包中打开 tftpd64.exe在NX30Pro环境下通过以…

FPGA使用Verilog实现CAN通信

FPGA实现CAN通信(Verilog) 1.作者使用的方法是通过FPGA芯片(如Xilinx公司的型号为XC7K325TFFG676-2)控制SJA1000T芯片(CAN控制器芯片)实现CAN通信,如下图所示: 2.熟悉连接方式之后&…

27-压力测试

测试目标 & 测试数据 ● 测试目标 ○ 测试集群的读写性能 / 做集群容量规划 ○ 对 ES 配置参数进行修改,评估优化效果 ○ 修改 Mapping 和 Setting,对数据建模进行优化,并测试评估性能改进 ○ 测试 ES 新版本,结合实际场…

单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)

目录 1.单元测试 实现单元测试的方法: 注意事项: 2.集成测试 需注意事项: 实现集成测试的方法: 如何实现高效且可靠的集成测试: 3.系统测试 实现系统测试的方法: 须知注意事项: 4.验收测试 实现验…

vxe-grid table 校验指定行单元格的字段,只校验某个列的字段

Vxe UI vue vxe-table 中校验表格行是非常简单的,只需要配置好校验规则,然后调用 validate 方法就可以自动完成校验,但是由于项目淡色特殊需求,在某个单元格的值修改后需要对另一个列的值就行校验,这个时候又不需要全部…