队列的使用以及模拟实现(C++版本)

news2024/11/23 10:54:38

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻强烈推荐优质专栏: 🍔🍟🌯C++的世界(持续更新中)
🐻推荐专栏1: 🍔🍟🌯C语言初阶
🐻推荐专栏2: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:讲解队列的使用以及模拟实现
金句分享:
✨来日方长,未来是星辰大海般璀璨,✨
✨不必踌躇于过去的半亩方塘.✨

目录

  • 一、队列的介绍
  • 二、队列的使用
    • 🍭练练手(用队列模拟栈)
  • 三、队列的模拟实现:
    • (1) 浅提一下双端队列`deque`
    • (2) 模拟实现

一、队列的介绍

C++中的队列是一种容器,使用队列可以实现先进先出(FIFO)的数据结构。队列可以添加元素到队列的末尾,也可以从队列的开头删除元素。
队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的
成员函数来访问其元素。元素从队尾入队列,从队头出队列。
C++中的队列通常使用STL库中的queue类实现。

队列的基本操作包括:

  • push(element):将元素插入队列的末尾。
  • pop():将队列的第一个元素删除。
  • front():返回队列的第一个元素。
  • back():返回队列的最后一个元素。
  • empty():判断队列是否为空。

队列具有先进先出FIFO(First In First Out)

入队列:进行"插入"操作的一端称为队尾
出队列:进行"删除"操作的一端称为队头

在这里插入图片描述

二、队列的使用

文档链接

在这里插入图片描述

接口名解释
empty()判断是否为空队列
size()返回队列中有效元素的个数
front()返回队首元素的引用
back()返回队尾元素的引用
push()将新元素入队列
emplace()将新元素入队列
pop()将队首元素出队

相信大家对队列的基本操作十分简单,下面演示一下具体使用,使用十分简单,就不过分介绍了.

测试代码:

#include <iostream>
#include <queue>
using namespace std;

void test1()
{
	queue<int> q1;//创建一个存储整形数据的队列

	q1.push(1);	//入队列
	q1.push(2);
	q1.push(3);
	q1.emplace(4);	//在stack使用时有详细介绍
	cout << "q1.front=" << q1.front() << endl;	//取队头元素
	cout << "q1.back=" << q1.back() << endl;	//取队尾元素

	//利用front的返回值,修改队首元素
	int& top = q1.front();
	top = 22;

	//利用back的返回值,修改队尾元素
	int& back = q1.back();
	top = -22;

	cout << endl;
	while (!q1.empty())		//只要队列不为空,就打印队头元素和出队列
	{
		cout << q1.front() << endl;
		q1.pop();//出队列
	}
}

int main()
{
	test1();
	return 0;
}

运行结果:

q1.front=1
q1.back=4
22
2
3
4

🍭练练手(用队列模拟栈)

题目链接:

同样,在C语言阶段,我们已经"十分痛苦"的写过这道题,现在C++阶段,再来写要轻松很多了.

用队列实现栈(C语言版本)

C++实现版本:

class MyStack {
public:
    MyStack() {}
    void push(int x) {
        if (!(q1.empty() && q2.empty())) {//往空栈里面插入数据
            q1.push(x);
        }
        else q2.push(x);
    }
    int pop() {
        queue<int>* empty_q ;
        queue<int>* un_empty_q;
        if (q1.empty()) {//找到两个队列中的空队列
            empty_q = &q1;
            un_empty_q = &q2;
        }
        else {
           empty_q = &q2;
           un_empty_q = &q1;
        }
        while (un_empty_q->size() > 1) {//将非空队列除了最后一个元素以外,其他全部插入到另一个队列
            empty_q->push(un_empty_q->front());
            un_empty_q->pop();
        }
        int front = un_empty_q->front();
        un_empty_q->pop();//删除剩下的最后一个元素->
        return front;
    }
    int top() {
        int top;
        if (q1.empty()) {
            top = q2.back();
        }
        else  top = q1.back();
        return top;
    }
    bool empty() {
        return q1.empty() && q2.empty();
    }
private:
    queue<int> q1;
    queue<int> q2;
};

三、队列的模拟实现:

(1) 浅提一下双端队列deque

在介绍队列的,模拟实现前,先介绍一下deque.
双端队列(Double-Ended Queue),是一种具有队列和栈的特点的数据结构。它允许从两端插入和删除元素,具有以下特点:

  1. 可以从队列两端进行插入和删除操作。
  2. 支持常数级别的访问和修改元素,即在队列头和尾进行操作的时间复杂度都为O(1)。
  3. 在中间进行操作时,性能较差,时间复杂度为O(n)。

是的,这个双端队列不仅支持头插头删,尾插尾删的同时,还支持随机访问.
那这不就意味着链表listvector都被淘汰了吗?
这里就不过多介绍deque的底层了,我们可以暂时理解为,类似于链表,但是链接起来的是一个个数组,这样就实现了这些功能.
但是,他并不能代替链表listvector.原因如下:

vector比较
deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不
需要搬移大量的元素
劣势:但是它的访问需要计算,在大量访问元素的场景时,与vector比就落后了.

list比较
优势:其底层是连续空间,空间利用率比较高,不需要存储额外字段。
缺点:deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多.

巧合的是,stackqueue都不需要访问中间的元素,访问头部数据效率还是很高的.
所以STLdeque作为stackqueue的底层数据结构再合适不过了.

(2) 模拟实现

队列也是一种容器适配器,我们底层采用deque实现还是很轻松的.

在这里插入图片描述

#pragma once
#include <iostream>
#include <deque>
using namespace std;

namespace cjn
{
    template<class T, class Con = deque<T>>//默认采用deque进行复用

    class queue
    {
    public:
        queue()
        {}

        void push(const T& x){      //入队列元素相当于尾插
            _c.push_back(x);
        }

        void pop(){
            _c.pop_front();         //出队列是从队首元素出队,所以相当于头删
        }

        T& back(){                  //返回队尾元素
            return _c.back();
        }

        const T& back()const{
            return _c.back();
        }

        T& front(){                 //返回队首元素
            return _c.front();
        }

        const T& front()const{
            return _c.front();
        }

        size_t size()const{         //返回队列中有效元素的个数
            return _c.size();
        }

        bool empty()const{          //判断队列是否为空
            return _c.empty();
        }

    private:
        Con _c;
    };
}

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

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

相关文章

AR智能眼镜:提升现场服务技能、效率与盈利能力的利器(一)

随着技术的不断进步&#xff0c;现场服务组织正朝着远程支持转变&#xff0c;用以解决技能差距和生产力问题&#xff0c;提高员工培训和操作效率&#xff0c;同时为企业提高利润率&#xff0c;创造竞争优势。 本文将探讨增强现实&#xff08;AR&#xff09;、辅助现实&#xf…

后台管理系统: 商品管理

商品管理之三级联动静态组件 先做俩个卡片组件&#xff0c;分开距离 三级联动很多地方都用到了它&#xff0c;我们可以封装成一个组件 注册为一个全局组件 <div><el-form :inline"true" class"demo-form-inline"><el-form-item label&qu…

数据集笔记:纽约花旗共享单车od数据

花旗共享单车公布的其共享单车轨迹数据&#xff0c;包括2013年-2021年曼哈顿、布鲁克林、皇后区和泽西城大约14500辆自行车和950个站点的共享单车轨迹数据 数据地址&#xff1a;Citi Bike System Data | Citi Bike NYC | Citi Bike NYC 性别&#xff08;0未知&#xff1b;1男&…

Idea引入thymeleaf失败解决方法

报错 Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.Fri Sep 29 09:42:00 CST 2023 There was an unexpected error (typeNot Found, status404). 原因&#xff1a;html没有使用thymeleaf 首先要引入…

pmp考试有包过班吗?靠谱吗?

PMP考试是全球范围内最为知名和认可的项目管理专业认证考试之一。对于想要在项目管理领域取得突破和进步的人来说&#xff0c;PMP认证是非常重要的一项资格。然而&#xff0c;对于很多考生来说&#xff0c;他们可能会关心一个问题&#xff1a;PMP考试有包过班吗&#xff1f;靠谱…

四川玖璨电子商务有限公司抖音培训引领电商新潮

近年来&#xff0c;随着电子商务的迅猛发展&#xff0c;抖音这个社交媒体平台也逐渐成为了商家必争之地。四川玖璨电子商务有限公司抖音培训&#xff0c;为你解锁电商流量密码&#xff0c;助你一飞冲天&#xff01; 一、抖音电商&#xff1a;下一个电商蓝海 作为拥有海量用户的…

操作系统相关杂项

系列文章目录 文章目录 系列文章目录前言一、dlopen, dlerror, dlclose直接执行动态库中的某个函数/某段代码 Linux共享库的组织共享库的构造和析构函数 动态链接堆栈初始化C全局构造与析构模拟实现库函数 freadsyscallsyscall 原理基于int的Linux的经典系统调用实现 前言 一、…

idea Springboot 图书管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 图书管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#…

基于Java实现的民宿预订管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

yolox相关

yolox YOLOXYOLOX-DarkNet53yolov3作为baseline输入端Strong data augmentationMosaic数据增强MixUp数据增强注意 BackboneNeckPrediction层Decoupled headDecoupled Head 细节 Anchor-freeAnchor Based方式Anchor Free方式标签分配初步筛选精细化筛选 SimOTASimOTA Other Back…

Thymeleaf快速入门(Spring版)

文章目录 Thymeleaf快速入门&#xff08;Spring版&#xff09;1、Thymeleaf概述2、Thymeleaf快速入门3、Thymeleaf基础语法3.1 th属性3.2 标准表达式语法3.2.1 变量表达式3.2.2 选择表达式3.2.3 URL表达式3.2.3 链接表达式3.2.4 国际化表达式3.2.5 片段引用表达式 Thymeleaf快速…

机器学习——一元线性回归构造直线,并给出损失函数

目 录 Question 问题分析 1.概念补充 2.流程分析 3.注意 具体实现 最终成果 代码 思考&#xff1a; Question 在二维平面有n个点&#xff0c;如何画一条直线&#xff0c;使得所有点到该直线距离之和最短 如果能找到&#xff0c;请给出其损失函数 问题分析 1.概念…

BASH shell脚本篇2——条件命令

这篇文章介绍下BASH shell中的条件相关的命令&#xff0c;包括&#xff1a;if, case, while, until, for, break, continue。之前有介绍过shell的其它基本命令&#xff0c;请参考&#xff1a;BASH shell脚本篇1——基本命令 1. If语句 if语句用于在顺序执行语句的流程中执行条…

visio将形状、图形、文字、符合进行任意角度旋转(已解决)

第一步&#xff1a;选择一个形状&#xff0c;并选定它&#xff0c;如下图 第二步&#xff1a;在视图中&#xff0c;按顺序点击 会弹出一个位置框&#xff0c;如下图。 这里设置 角度的值 为 35deg&#xff0c;按“回车键”&#xff0c;如下图

爆肝整理,常问接口自动化测试面试题+答案(详全)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题&#xff1…

LLMs: 强化学习从人类反馈中学习Reinforcement learning from human feedback (RLHF)

让我们考虑一下文本摘要的任务&#xff0c; 即使用模型生成一段简短的文本&#xff0c;捕捉 较长的文章中最重要的观点。 您的目标是通过向模型 展示人工生成的摘要示例&#xff0c;使用微调来提高模型的总结能力。 2020年&#xff0c;OpenAI的研究人员发表了一篇论文&#xff…

【SQL】mysql创建定时任务执行存储过程--20230928

1.先设定时区 https://blog.csdn.net/m0_46629123/article/details/133382375 输入命令show variables like “%time_zone%”;&#xff08;注意分号结尾&#xff09;设置时区&#xff0c;输入 set global time_zone “8:00”; 回车,然后退出重启&#xff08;一定记得重启&am…

定时任务管理平台青龙 QingLong

一、关于 QingLong 1.1 QingLong 介绍 青龙面板是支持 Python3、JavaScript、Shell、Typescript 多语言的定时任务管理平台&#xff0c;支持在线管理脚本和日志等。其功能丰富&#xff0c;能够满足大部分需求场景&#xff0c;值得一试。 主要功能 支持多种脚本语言&#xf…

《动手学深度学习 Pytorch版》 7.6 残差网络(ResNet)

import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l7.6.1 函数类 如果把模型看作一个函数&#xff0c;我们设计的更强大的模型则可以看作范围更大的函数。为了使函数能逐渐靠拢到最优解&#xff0c;应尽量使函数嵌套&…

Java 基于 SpringBoot 的在线学习平台

1 简介 基于SpringBoot的Java学习平台&#xff0c;通过这个系统能够满足学习信息的管理及学生和教师的学习管理功能。系统的主要功能包括首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;课程信息管理&#xff0c;类型管理&#xff0c;作业信息…