数据结构(初阶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.mzph.cn/bicheng/60986.shtml

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

相关文章

C++知识点总结(57):STL综合

STL综合 一、数据结构1. 队列2. 映射 二、队列例题1. 约瑟夫环&#xff08;数据加强&#xff09;2. 打印队列3. 小组队列4. 日志统计 2.0 三、映射真题1. 眼红的 Medusa2. 美食评委 一、数据结构 1. 队列 功能代码定义queue<tp>q入队.push(x)出队.pop()队头.front()队尾…

java中volatile 类型变量提供什么保证?能使得一个非原子操作变成原子操作吗?

大家好&#xff0c;我是锋哥。今天分享关于【java中volatile 类型变量提供什么保证&#xff1f;能使得一个非原子操作变成原子操作吗&#xff1f;】面试题。希望对大家有帮助&#xff1b; java中volatile 类型变量提供什么保证&#xff1f;能使得一个非原子操作变成原子操作吗&…

Python - 初识Python;Python解释器下载安装;Python IDE(一)

一、初识Python Python 是一种高级编程语言&#xff0c;Python是一种面向对象的解释型计算机程序设计语言&#xff0c;Python由荷兰国家数学与计算机科学研究中心的吉多范罗苏姆&#xff08;&#xff09;Guido van Rossum吉多范罗苏姆&#xff08;&#xff09;于1989 年底发明…

flink StreamGraph 构造flink任务

文章目录 背景主要步骤代码 背景 通常使用flink 提供的高级算子来编写flink 任务&#xff0c;对底层不是很了解&#xff0c;尤其是如何生成作业图的细节 下面通过构造一个有向无环图&#xff0c;来实际看一下 主要步骤 1.增加source 2.增加operator 3. 增加一条边&#xff0…

AR眼镜方案_AR智能眼镜阵列/衍射光波导显示方案

在当今AR智能眼镜的发展中&#xff0c;显示和光学组件成为了技术攻坚的主要领域。由于这些组件的高制造难度和成本&#xff0c;其光学显示模块在整个设备的成本中约占40%。 采用光波导技术的AR眼镜显示方案&#xff0c;核心结构通常由光机、波导和耦合器组成。光机内的微型显示…

六:从五种架构风格推导出HTTP的REST架构

在分布式系统中,架构风格(Architectural Style)决定了系统组件如何交互、通信、存储和管理数据。每种架构风格都有其独特的特性和适用场景。本文将从五种典型的架构风格出发,逐步探讨它们如何影响了REST(Representational State Transfer,表述性状态转移)架构风格的设计…

星辰资讯 | TiDB v7.5.4 v8.4.0 发版

作者&#xff1a; ShawnYan 原文来源&#xff1a; https://tidb.net/blog/6e299751 TiDB 8.4.0 DMR 发版 11 月 11 日&#xff0c;TiDB 8.4.0 版本发布&#xff0c;以下是该版本的一些关键特性和改进&#xff1a; 性能 分区表全局索引成为正式功能 &#xff1a;提高检索…

Python 打包教程:从零开始构建可分发的Python包

Python 打包教程&#xff1a;从零开始构建可分发的Python包 引言 在Python开发中&#xff0c;打包是一个重要的环节。无论是共享代码、发布库还是部署应用&#xff0c;创建一个可分发的Python包都是必不可少的步骤。本文将详细介绍如何打包Python项目&#xff0c;涵盖从基础知…

大模型基础BERT——Transformers的双向编码器表示

大模型基础BERT——Transformers的双向编码器表示 整体概况 BERT&#xff1a;用于语言理解的深度双向Transform的预训练 论文题目&#xff1a;BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding Bidirectional Encoder Representations from…

Python教程笔记(2)

Python教程 5.1 列表详解5.1.3 列表推导式5.1.4 嵌套的列表推导式 5.7 深入条件控制6.1 模块详解6.3 dir()7.1 格式化字符串字面值7.1.3 手动格式化字符串 7.2 读写文件 5.1 列表详解 Python 中所有可变数据结构返回值为None。实现队列最好用 collections.deque。 5.1.3 列表…

DAHL:利用由跨越 29 个类别的 8,573 个问题组成的基准数据集,评估大型语言模型在生物医学领域长篇回答的事实准确性。

2024-11-14&#xff0c;由首尔国立大学创建的DAHL数据集&#xff0c;为评估大型语言模型&#xff08;LLMs&#xff09;在生物医学领域长文本生成中的幻觉问题提供了一个重要的工具&#xff0c;这对于提高模型的准确性和可靠性具有重要意义。 数据集地址&#xff1a;DAHL|生物医…

GStreamer 简明教程(九):Seek 与跳帧

系列文章目录 GStreamer 简明教程&#xff08;一&#xff09;&#xff1a;环境搭建&#xff0c;运行 Basic Tutorial 1 Hello world! GStreamer 简明教程&#xff08;二&#xff09;&#xff1a;基本概念介绍&#xff0c;Element 和 Pipeline GStreamer 简明教程&#xff08;三…

【微软:多模态基础模型】(1)从专家到通用助手

欢迎关注【youcans的AGI学习笔记】原创作品 【微软&#xff1a;多模态基础模型】&#xff08;1&#xff09;从专家到通用助手 【微软&#xff1a;多模态基础模型】&#xff08;2&#xff09;视觉理解 【微软&#xff1a;多模态基础模型】&#xff08;3&#xff09;视觉生成 【微…

GRE做题笔记(零散的个人经验)

locomotive机车By 1813, the Luddite resistance had all but vanished. all but表示“几乎完全”的程度&#xff0c;或者表示排除piston活塞attributed to 归因于how a sportsperson accounted for their own experience of stress 运动员如何解释自己的压力经历 &#xff0c;…

【蓝桥杯算法】Java的基础API

1. BigInteger 的使用 1.1. 判素数 package 模板;import java.math.BigInteger; import java.util.Scanner;public class 判素数 {static Scanner in new Scanner(System.in);public static void main(String[] args) {int q in.nextInt();while (q-- > 0) {BigInteger …

【项目实战】基于 LLaMA-Factory 通过 LoRA 微调 Qwen2

【项目实战】基于 LLaMAFactory 通过 LoRA 微调 Qwen2 一、项目介绍二、环境准备1、环境准备2、安装LLaMa-Factory3、准备模型数据集3.1 模型准备3.2 数据集准备 三、微调1、启动webui2、选择参数3、训练 四、测试五、总结 一、项目介绍 LLaMA-Factory是一个由北京航空航天大学…

数据仓库在大数据处理中的作用

数据仓库&#xff08;Data Warehouse&#xff0c;简称DW或DWH&#xff09;是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合&#xff0c;用于支持管理决策。以下是对数据仓库及其在大数据处理中作用的详细解释&#xff1a; 一、数据仓库的定义 面向主题&#x…

第23课-C++-红黑树的插入与旋转

&#x1f307;前言 红黑树是一种自平衡的二叉搜索树&#xff0c;因其出色的性能&#xff0c;广泛应用于实际中。Linux 内核中的 CFS 调度器便是一个使用红黑树的例子&#xff0c;这足以说明它的重要性。红黑树的实现通过红黑两种颜色的控制来维持平衡&#xff0c;并在必要时使…

基于 CentOS7.6 的 Docker 下载常用的容器(MySQLRedisMongoDB),解决拉取容器镜像失败问题

安装MySQL&Redis&MongoDB mysql选择是8版本&#xff0c;redis是选择4版本、mongoDB选择最新版&#xff0c;也可以根据自己的需要进行下载对应的版本&#xff0c;无非就是容器名:版本号 这样去拉去相关的容器镜像。如果你还不会在服务器中安装 docker&#xff0c;可以查…

C#/WinForm拖拽文件上传

一、首先创建一个上传文件的类&#xff0c;继承Control类&#xff0c;如下&#xff1a; public class UploadControl : Control{private Image _image;public UploadControl(){this.SetStyle(ControlStyles.UserPaint | //控件自行绘制&#xff0c;而不使用操作系统的绘制Cont…