循环队列(C++)

news2024/11/19 2:25:23

循环队列是一种特殊的队列实现,在顺序队列的基础上进行了优化。通常,循环队列使用固定长度的数组来表示队列元素,头和尾指针挂钩形成循环的维度感知队列长度,并提高队列操作效率,因为这种结构需要的内存量比链表数据结构更小。

循环队列相对于普通队列的优势在于:

  1. 避免了数据移动所带来的性能损失。 顺序队列的主要瓶颈在于队首的位置不可变,出队后队列内其他元素必须整体向前移动一个位置,若处理大量数据时,则会带来较多时间复杂度为O(n)的操作。而在循环队列中可以频繁变换队首元素,支持随机访问(O(1)),避免了数据迁移的开销。

  2. 循环队列可以处理不定长的数据流 因为头和尾指针都指向空位置时,队列被看作已满,但实际上并不阻止任何新入队元素的到来。当队列长度不能再增加时,队首和队尾的位置互相套住。

我们通过力扣上的一道题练习循环队列

 

class MyCircularQueue {
public:
    //初始化列表的初始化顺序是根据成员变量声明的先后顺序!
    MyCircularQueue(int k)
        : _front(0)
        , _rear(0)
        , _k(k)
        , _a(new int[_k + 1])
    {}

     MyCircularQueue()
    {
        delete [] _a;
        _a = nullptr;
    }

    bool enQueue(int value) {
        if (isFull())
            return false;

        _a[_rear++] = value;
        if (_rear == _k + 1)
            _rear = 0;

        return true;
    }

    bool deQueue() {
        if (isEmpty())
            return false;

        _front++;
        if (_front == _k + 1)
            _front = 0;

        return true;
    }

    int Front() {
        if (isEmpty())
            return -1;
        return _a[_front];
    }

    int Rear() {
        if (isEmpty())
            return -1;
        return _a[(_rear - 1) < 0 ? _k : (_rear - 1)];
    }

    bool isEmpty() {
        return _front == _rear;
    }

    bool isFull() {
        return (_rear + 1) % (_k + 1) == _front;
    }

private:
    int _front;
    int _rear;
    int _k;
    int* _a;
};

这段代码实现了一个循环队列的基本操作,包括入队、出队、获取队头和队尾元素、检查队列是否为空或已满等方法。

循环队列是一种利用数组来实现队列的数据结构。同普通队列相比,循环队列提高了空间利用率,并解决了顺序队列中“假溢出”的问题。在循环队列中,所有元素都保存在一个连续的数组中,并且队列的两端都连接在数组的两端上。

类MyCircularQueue中定义了队列的常用变量_front,_rear,_k和_a。其中_front和_rear分别表示队列头和队列尾元素的位置。_k用于记录队列的最大容量。_a是一个指向动态数组的指针,包含的是队列中存储的元素。

实际上这里使用了数组的一部分来表示队列,为了避免队列在完全满时和空时的判断异常,被留空的一个位置。

入队enQueue()函数将元素加入到队列尾部。首先调用isFull()函数来检查队列是否已经满了。如果队列已满,则返回false,否则将给定的value放入数组中并移动_rear指针。当_rear达到数组末尾时,我们将其重置为0,以确保它一直指向队列的第一个位置。

出队deQueue()函数从队列头部删除元素。首先调用isEmpty()函数检查队列是否为空。如果队列非空,则将_front指针后移一位并返回true,否则返回false。当_front达到数组末尾时,我们也将其重置为0,以确保它一直指向队列的第一个位置。

Front()和Rear()函数分别获取队列头元素和队列尾元素。这两个方法首先检查队列是否为空,如果是则返回-1,否则返回_a数组中的相应元素。注意,由于是循环队列,尾指针_rear可能会回到数组开头。所以,在Rear()函数中需要特殊判断_rear是否在队列的第一个位置。

isEmpty()函数和isFull()函数分别检查队列是否为空或已满。队列为空的条件是_front等于_rear,队列已满的条件是(_rear + 1) % (_k + 1) == _front.

最后,类MyCircularQueue定义了析构函数来释放动态数组,并且通过初始化列表对数据成员进行初始化。

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

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

相关文章

论文翻译:DeepFilterNet

目录 摘要1. 引言2. DeepfilterNet2.1. 信号模型2.2. Deep Filtering2.3. 框架概述2.4. DNN模型2.5. 数据处理2.6. 损失函数 3. 实验3.1. 训练步骤3.2. 结果 4. 结论5. 参考文献 论文题目&#xff1a;DeepFilterNet: A Low Complexity Speech Enhancement Framework for Full-B…

MQTT与传统的HTTP协议对比,优势在哪里呢?

HTTP是应用最为广泛和流行的协议。但是MQTT在过去的几年里迅速取得了进展。在讨论物联网开发的时候&#xff0c;开发者必须在这两者之间作出选择。 MQTT集中于数据&#xff0c;而HTTP集中于文档。HTTP是一个用于客户端-服务器计算的请求-响应协议&#xff0c;它并非总是为移动设…

位图和布隆过滤器

目录 位图 布隆过滤器 位图 假设有1000 万个范围在1~ 1亿的整数。如何快速查找某个整数是否出现在这1000万个整数中? 当然&#xff0c;这个问题仍然可以使用哈希表来解决。不过&#xff0c;针对这个“特殊”问题&#xff0c;我们可以使用一种比较“特殊”的哈希表&#xff…

阿里云手动创建Nginx-Ingress

阿里云相关文档 1、在ACK管理控制台点击如下 应用市场–>筛选(以ack-ingress-nginx-v1为例)–>点击安装–>一键部署–>自己定义集群、命名空间以及ingress名称 1.20以下集群选中ack-ingress-nginx。 1.20及以上集群选中ack-ingress-nginx-v1。 应用市场 筛选…

Linux学习笔记 --- Linux基础命令Part2

2.9 查找命令(which、find&#xff09; 目标&#xff1a;1. 掌握使用which命令查找命令的程序文件 2. 掌握使用find命令查找指定文件 which命令 我们在前面学习的Linux命令&#xff0c;其实它们的本体就是一个个的二进制可执行程序。 和Windows系统中的.exe文件&#x…

六级备考24天|CET-6|翻译技巧3|翻译2020年6月真题红楼梦|逻辑问题|理解背诵|20:50~22:30

目录 一、逻辑重建 例句1 例句2 例句3 二、定语和状语 定语的翻译原则 什么是状语&#xff1f; 状语位置 状语的基本形式 三、主动和被动 四、无主句 五、并列和连动 连动 六、作题步骤 七、红楼梦 PRACTICE ANSWER​ 时态问题 一、逻辑重建 试比较&#xff1a; 1. 下雨了…

c++中文路径中文文件读写

踩了坑&#xff0c;两个地方需要注意&#xff0c;否则就会乱码或无法找到文件 &#xff08;1&#xff09;采用utf-8格式&#xff0c;对cpp文件进行编码&#xff0c;用utf-8的方式对内容尽心高度写&#xff0c;方法是std::setlocale(LC_ALL, ".UTF-8"); &#xff08…

dvwa靶场通关(二)

第二关&#xff1a;Command Injection&#xff08;命令注入&#xff09; 什么是命令注入&#xff1a; 命令注入就是在需要输入数据的地方输入了恶意代码&#xff0c;而且系统并没有对其进行过滤或者其他处理导致恶意代码也被执行&#xff0c;最终导致数据泄露或者正常数据被破…

软件测试基础知识整理(八)- 软件缺陷

目录 一、软件缺陷 1.1 缺陷定义 1.2 缺陷判定标准 1.3 软件缺陷产生的原因 1.4 软件缺陷产生的根源 1.5 软件缺陷信息 1.5.1 缺陷状态 1.5.2 缺陷严重程度 1.5.3 缺陷优先级 1.6 缺陷报告模板 1.7 缺陷报告注意事项 1.8 缺陷跟踪流程 1.9 缺陷数据分析关注的问题 …

chatgpt赋能python:Pythonsearchsorted:用于搜索排序数组的快速工具

Python searchsorted&#xff1a;用于搜索排序数组的快速工具 在Python编程中&#xff0c;有时需要在有序数组中快速查找值的位置。Python searchsorted工具提供了一种快速而高效的方法&#xff0c;可用于在已排序的数组中搜索值的位置。在本文中&#xff0c;将深入探讨Python…

实验二:熟悉常用的HDFS操作

实验环境: (1)操作系统:Linux(建议 Ubuntu 16.04 或 Ubuntu 18.04)。 (2)Hadoop 版本:3.1.3。 (3)JDK 版本:1.8。 (4)Java IDE: Eclipse。 实验内容与完成情况: (1)编程实现以下功能,并利用Hadoop提供的Shell命令完成相同任务。 ①向HDFS中上传任意文本文件,如果指定的文…

简介KettlePack

目录 &#x1f3c6;1、本机环境&#xff1a; &#x1f3c6;2、虚拟机环境&#xff1a; &#x1f3c6;3、安装MySQL &#x1f3c6;4、安装kettlePack ⭐️4.1、Windows版安装 ⭐️4.2、Linux安装 ⭐️4.3、docker安装 简介&#xff1a; 今日工作中的ETL脚本使用了从晶的…

【通义千问】什么是通义千问,如何免费获得内测和使用方法。

什么是通义千问&#xff0c;如何免费获得内测和使用方法。 什么是通义千问怎么获得内测资格申请方法有两种第一种直接点击申请体验第二种直接点击使用邀请码 通义千问邀请码怎么获得参与社区活动邀请好友关注通义千问微信公众号参加通义千问线上课程向通义千问官方提问 通义千问…

【C++】4.jsoncpp库:jsoncpp库安装与使用入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍jsoncpp的使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&am…

Apache Kafka - ConsumerInterceptor 实战(2)

文章目录 Pre思路示例配置文件自定义 拦截器使用测试 小结 Pre Apache Kafka - ConsumerInterceptor 实战 (1) 用代码的方式实现了ConsumerInterceptor , 接下来我们用 配置的方式来实现一下 。 思路 如何找配置类 KafkaProperties 有些属性是很明显的有的&#xff0c;其他没…

STM32单片机(二)STM32环境搭建

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

LLMs开源模型们的分布式训练和量化

前一篇博文整理了&#xff1a; LLMs开源模型们和数据集简介 这篇博文主要整理一下目前流行的训练方法和量化。 &#xff08;图自Towards a Unified View of Parameter-Efficient Transfer Learning&#xff09; Tuning Strategies 使通用LLMs适应下游任务的最常见方法是微调…

电气器件系列三十七:多路温度测试仪、温度巡检仪

巡检仪适用于多点测量显示及控制&#xff0c;集多台仪表功能于一体&#xff0c;一般可巡检1&#xff5e;64路测量信号,可巡回检测和显示多路信号&#xff0c;与各类传感器、变送器配合使用&#xff0c;现已开发出八路巡检仪\十六路巡检仪\24路巡检仪-64路可对多路温度、压力、液…

项目总结 车牌识别

代码贴&#xff1a;OpenCV实战5 车牌号识别_opencv车牌字符识别_爱钓鱼的歪猴的博客-CSDN博客 目录 1、效果 2、代码思路 0、准备车配字符模板图片以及字符文件 1、对整图进行预处理 得到突出车牌的cany边缘图 2、车牌字体联通在一起&#xff0c;形成一个区域 3、筛选出车…

【华为OD机试】太阳能板最大面积【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 给航天器一侧加装长方形或正方形的太阳能板(图中的红色斜线区域),需要先安装两个支柱(图中的黑色竖条), 再在支柱的中间部分固定太阳能板。 但航天器不同位置的支柱长度不同,太阳…