【C++】STL中stack、queue、deque的使用

前言:在前面我们学习了List的模拟实现与使用,今天我们进一步的来学习stack、queue、deque的使用方法,然后为后面的模拟实现做一下铺垫。

💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:高质量C++学习 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
在这里插入图片描述


目录标题

  • 栈的常见功能
    • stack的常见使用方法
  • 队列的常见功能
    • queue的常见使用方法
  • 什么是deque
    • deque的常见功能
    • deque的常见使用方法


注:这里不会注重讲什么是栈和队列,只会大概的解释一下,不懂的可以看看前面的博客有详细讲解:栈和队列

栈的常见功能

  1. 入栈
  2. 出栈
  3. 获取栈顶元素
  4. 检测栈是否为空
  5. 获取栈中有效元素个数

stack的常见使用方法

  1. 包含头文件:首先,需要包含 头文件
#include <stack>
  1. 创建Stack对象:使用 std::stack 模板类创建Stack对象
std::stack<int> myStack;
  1. 元素入栈:使用 push() 函数将元素添加到栈的顶部
myStack.push(10);//入栈
myStack.push(20);
myStack.push(30);
  1. 元素出栈:使用 pop() 函数从栈的顶部移除元素
myStack.pop();//栈顶的元素出栈
  1. 访问栈顶元素:使用 top() 函数访问栈顶的元素
int topElement = myStack.top();//获取栈顶元素
  1. 获取栈中元素的个数:使用 size() 函数获取栈中元素的个数
int stackSize = myStack.size();//获取栈中元素个数
  1. 检查栈是否为空:使用 empty() 函数检查栈是否为空
int main()
{
	stack<int>s1;
	s1.push(20);
	s1.push(30);
	s1.push(40);
	if (s1.empty())
	{
		cout << "空栈" << endl;
	}
	else
		cout <<"该栈的元素个数是: " << s1.size() << endl;
	return 0;
}

队列的常见功能

  1. 队尾 入队列
  2. 队头出队列
  3. 获取队列头部元素
  4. 获取队尾元素
  5. 检测队列是否为空
  6. 获取队列中有效元素个数

queue的常见使用方法

在C++中,我们可以使用STL(Standard Template Library)的queue容器来实现队列。以下是queue的常见使用方法:

  1. 包含头文件:在使用queue之前,我们需要包含头文件。
#include <queue>
  1. 创建队列:使用queue类来创建一个队列对象。
queue<int> q; // 创建一个整型队列
  1. 入队操作:使用push()函数将元素添加到队列的末尾。
q.push(10); // 将元素10添加到队列末尾
  1. 出队操作:使用pop()函数从队列的头部移除并返回元素。
q.pop(); // 移除队列的头部元素
  1. 访问队头元素:使用front()函数可以访问队列的头部元素。
int frontElement = q.front(); // 获取队列头部元素,但不移除
  1. 判断队列是否为空:使用empty()函数可以检查队列是否为空。
bool isEmpty = q.empty(); // 如果队列为空,则返回true,否则返回false

例子:

#include <iostream>
#include <queue>

int main() {
    std::queue<int> q;
    
    q.push(10);
    q.push(20);
    q.push(30);
    
    std::cout << "Queue size: " << q.size() << std::endl;
    
    while (!q.empty())//将队列中的元素依次出队列,知道队列为空 
    {
        int frontElement = q.front();
        std::cout << frontElement << " ";
        q.pop();
    }
    
    return 0;
}

输出:

Queue size: 3
10 20 30

什么是deque

在C++中,deque(双端队列)是一种线性容器,允许在两端进行插入和删除操作。deque是 “double-ended queue” 的缩写。

deque类似于vector,但不同之处在于deque允许在容器的前端和后端进行高效的插入和删除操作,而vector只支持在末尾进行插入和删除操作。deque还提供了随机访问元素的能力,类似于数组。

deque的主要特点包括:

在两端进行高效的插入和删除操作。
随机访问元素的能力。
动态分配存储空间,自动扩展和收缩容量。


deque的常见功能

deque(双端队列)是C++标准库中的一种容器,提供了以下常见功能:

  1. 在队列的前端和后端进行插入和删除操作。
  2. 可以在常量时间内在队列的前端和后端访问元素。
  3. 支持随机访问,可以通过索引访问元素。
  4. 动态分配内存,可以根据需要自动扩展和收缩容量。
  5. 可以在队列的任意位置插入或删除元素。
  6. 可以使用迭代器进行遍历和操作。
  7. 支持使用构造函数和初始化列表进行初始化。
  8. 提供了一系列的成员函数来获取队列的大小、判断队列是否为空等。

总之,deque提供了灵活和高效的双端队列实现,适用于需要频繁在队列的前端和后端进行操作的场景。


deque的常见使用方法

在C++中,使用deque(双端队列)的常见方法如下:

  1. 头文件引入:

    #include <deque>
    
  2. 创建deque对象:

    std::deque<数据类型> dequeName;
    
  3. 在队列的前端和后端插入元素:

    dequeName.push_front(element); // 在队列的前端插入元素,element为数据
    dequeName.push_back(element); // 在队列的后端插入元素
    
  4. 在队列的前端和后端删除元素:

    dequeName.pop_front(); // 删除队列的第一个元素
    dequeName.pop_back(); // 删除队列的最后一个元素
    
  5. 访问队列的前端和后端元素:

    dequeName.front(); // 访问队列的第一个元素
    dequeName.back(); // 访问队列的最后一个元素
    
  6. 访问队列中的元素:

    dequeName[index]; // 使用索引访问元素,例如 dequeName[0],类似于数组和vector支持下标访问
    
  7. 获取队列的大小:

    dequeName.size(); // 获取队列中元素的个数
    
  8. 判断队列是否为空:

    dequeName.empty(); // 如果队列为空返回 true,否则返回 false
    
  9. 使用迭代器遍历队列:

    int main()
    {
    	deque<int>s1 = { 1,2,3,4,5 };
    	s1.push_front(10);//队头插入元素
    	s1.push_back(20);//队尾插入元素
    	deque<int>::iterator it = s1.begin();//使用迭代器遍历deque
    	while (it != s1.end())
    	{
    		cout << *it << " ";
    		it++;
    	}
    	cout << endl;
    	return 0;
    }
    

    在这里插入图片描述

  10. 清空队列:

    dequeName.clear(); // 清空队列中的所有元素
    
  11. 修改deque的大小:

    注:修改deque的大小为newSize。如果newSize比deque的当前大小小,则删除多余的元素;如果newSize比deque的当前大小大,则在deque的尾部添加默认值元素

    int main()
    {
    	deque<int> s1 = { 1,1,1,1,1 };
    	s1.resize(10, 2);//修改deque的大小,多余的全部变为2
    	deque<int>::iterator it = s1.begin();
    	for (auto e : s1)
    	{
    		cout << *it << " ";
    		it++;
    	}
    	return 0;
    }
    

    在这里插入图片描述

这些是deque的常见使用方法,通过这些方法可以对deque进行插入、删除、访问、遍历等操作。


总结deque的优缺点:
deque(双端队列)是 C++ 标准库提供的一种容器,它允许在两端进行插入和删除操作。deque 的优点和缺点如下:

优点:

  1. 支持高效的在两端进行插入和删除操作。deque 是由一系列块组成的,可以在两端分别进行操作,而不需要移动其他元素。
  2. 可以动态地调整容器的大小。deque 是一个动态数组,可以根据需要动态地增加或减少容量。
  3. 支持随机访问。deque 使用下标访问元素的时间复杂度为 O(1)。

缺点:

  1. deque 的内存占用比较大。由于 deque 使用了一系列块来存储元素,相比于 vector 或 list,它需要额外的内存来存储块之间的指针。
  2. 在插入和删除操作时可能会导致迭代器失效。当在中间位置进行插入或删除操作时,由于需要移动其他元素,可能导致迭代器失效。
  3. 不支持连续的内存存储。由于 deque 的元素是存储在不同的块中的,因此它的存储不是连续的,这可能导致一些性能上的损失。
  4. 不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到
    某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。

总结:deque 适用于需要在两端频繁地进行插入和删除操作的场景,但如果对内存占用和连续存储有较高要求,可能需要考虑其他容器


好啦,今天的内容就到这里啦,下期内容预告stl中stack和queue的模拟实现.


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


🌏🗺️ 这里祝各位接下来的每一天好运连连 💞💞

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

S7-1200PLC和V90总线伺服通过工艺对象实现定位控制(标准报文3应用)

V90PN总线伺服驱动和S7-1200PLC通信需要安装GSD文件,PLC通过各种标准报文实现V90的位置和速度控制。 1、V90伺服驱动器控制(PN版本) V90伺服驱动器控制(PN版本)_v90 pn 最简接线-CSDN博客文章浏览阅读303次。V90伺服驱动器脉冲控制常用参数和接线,请查看下面文章链接:SMAR…

VirtFuzz:一款基于VirtIO的Linux内核模糊测试工具

关于VirtFuzz VirtFuzz是一款功能强大的Linux内核模糊测试工具&#xff0c;该工具使用LibAFL构建&#xff0c;可以利用VirtIO向目标设备的内核子系统提供输入测试用例&#xff0c;广大研究人员可以使用该工具测试Linux内核的安全性。 工具要求 1、Rust&#xff1b; 2、修补的Q…

学习cel-go了解一下通用表达语言评估是什么

文章目录 1. 前言2. cel-go2.1 cel-go关键概念Applications(应用)Compilation(编译)Expressions(表达式)Environment环境解析表达式的三个阶段 3. cel-go的使用4. cel-go使用5. 说明6. 小结7. 参考 1. 前言 最近因为在项目里面实现的一个使用和||来组合获取字段值的功能有点儿…

一键解锁创意无界:高效AI生成古典肖像图片,轻松打造艺术化身

在数字化时代&#xff0c;创意与艺术的结合正逐渐改变我们的生活。你是否曾梦想过拥有一幅专属于自己的古典肖像画&#xff0c;却又苦于找不到合适的画师或高昂的费用而望而却步&#xff1f;现在&#xff0c;这一切都将成为现实&#xff01; 进入首助编辑高手的AI魔法智绘图板块…

Java—装饰器模式

介绍 装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你动态地将行为添加到现有的对象中&#xff0c;而无需修改其代码。装饰器模式提供了比继承更灵活的功能扩展方式。 主要角色 Component&#xff1a;定义一个对…

【编程技巧】降低程序复杂度:控制逻辑与业务逻辑分离

为什么要降低代码复杂度 好的项目都是迭代出来的&#xff0c;所以代码肯定是会被人维护的 降低代码复杂度就是为了降低下一个维护人的维护成本&#xff0c;更简单地理解跟修改代码 代码组成 代码逻辑 控制逻辑 业务逻辑 控制逻辑 控制业务逻辑的代码 例如&#xff1a;加缓存…

Redis-sentinel(哨兵模式)的搭建步骤及相关知识

1、什么是redis-sentinel&#xff0c;和redis主从复制相比&#xff0c;它具有什么优势 1.1、redis主从复制 Redis主从复制是一种用于数据冗余和可伸缩性的机制&#xff0c;它将一台Redis服务器的数据复制到其他Redis服务器。在这种模式下&#xff0c;数据会实时地从一个主节点…

PS通过GTX实现SFP网络通信1

将 PS ENET1 的 GMII 接口和 MDIO 接口 通过 EMIO 方 式引出。在 PL 端将引出的 GMII 接口和 MDIO 接口与 IP 核 1G/2.5G Ethernet PCS/PMA or SGMII 连接&#xff0c; 1G/2.5G Ethernet PCS/PMA or SGMII 通过高速串行收发器 GTX 与 MIZ7035/7100 开发…

Pytest 读取excel文件参数化应用

本文是基于Pytest框架&#xff0c;读取excel中的文件&#xff0c;传入页面表单中&#xff0c;并做相应的断言实现。 1、编辑媒体需求 首先明确一下需求&#xff0c;我们需要对媒体的表单数据进行编辑&#xff0c;步骤如下&#xff1a; 具体表单如下图所示 1、登录 2、点击我…

配置中心理论学习

配置中心是一种用于集中管理应用程序配置信息的系统或服务。在微服务架构中&#xff0c;由于服务数量众多且可能分布在不同的环境中&#xff0c;配置中心的作用尤为突出。它允许开发者将配置信息从应用程序代码中分离出来&#xff0c;集中存储和管理&#xff0c;从而提高配置的…

训练营第三十八天 | 309.最佳买卖股票时机含冷冻期动态规划系列七总结714.买卖股票的最佳时机含手续费股票问题总结篇!

309.最佳买卖股票时机含冷冻期 力扣题目链接(opens new window) 给定一个整数数组&#xff0c;其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#x…

Linux文本处理三剑客+正则表达式

Linux文本处理常用的3个命令&#xff0c;脚本或者文本处理任务中会用到。这里做个整理。 三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;grep更适合单纯的查找或匹配文本&#xff0c;sed更适合编辑匹配到的文本&#xff0c;awk更适合格式化文本&#xff0c;对…

硬件SPI读写W25Q64

硬件SPI读写W25Q64 接线图&#xff08;和软件SPI一样&#xff09; 使用SPI1&#xff0c;SCK&#xff0c;接PA5&#xff1b;MISO&#xff0c;接PA6&#xff1b;MOSI&#xff0c;接PA7&#xff1b;NSS&#xff0c;可接PA4。 接线图对应&#xff1a;PA5接CLK引脚&#xff0c;PA6…

基于深度学习的红外船舶检测识别分类完整实现数据集8000+张

随着遥感技术的快速发展&#xff0c;包括无人机、卫星等&#xff0c;红外图像在船舶检测识别中的作用日益凸显。相对于可见光图像&#xff0c;红外图像具有在夜晚和恶劣天气条件下高效检测识别船舶的天然优势。近年来&#xff0c;深度学习作为一种强大的图像处理技术&#xff0…

微服务链路追踪ELK

微服务链路追踪&ELK 链路追踪概述链路追踪sluthzipkinelk日志管理平台 一 链路追踪 1 概述 1.1 为什么需要链路追踪 ​ 微服务架构是一个分布式架构&#xff0c;它按业务划分服务单元&#xff0c;一个分布式系统往往有很多个服务单元。由于服务单元数量众多&#xff0…

sqoop的安装配置

1. 上传并解压安装包 tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C ../server/ 重命名&#xff1a;mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop 2. 配置环境变量 sudo vim /etc/profile # 配置sqoop的环境变量 export SQOOP_HOME/export/server/sqoop export PATH$PATH…

Camtasia2024破解永久激活码注册码分享最新

随着数字时代的到来&#xff0c;视频制作已成为许多人日常生活和工作中不可或缺的一部分。而在众多视频编辑软件中&#xff0c;Camtasia凭借其强大的功能和易用性&#xff0c;赢得了广泛的用户喜爱。近期&#xff0c;Camtasia 2024的破解版本在网络上引起了广泛关注。本文旨在为…

FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《03》

系列文章 FreeRTOS移植&#xff1a;STM32L476 nucleo-L476RG 开发板《01》 FreeRTOS移植&#xff1a;STM32L476 nucleo-L476RG 开发板《02》 说明 在上篇 FreeRTOS移植&#xff1a;STM32L476 nucleo-L476RG 开发板《02》 开始移植适配 FreeRTOS&#xff0c;FreeRTOS 移植适配…

大数据技术学习回顾01-大数据的特点、技术体系(三驾马车)

参考来源&#xff1a; 极客时间专栏&#xff1a;从0开始学大数据&#xff0c;作者&#xff1a;李智慧 大数据技术整体概览 大数据技术体系 大数据处理的主要应用场景包括数据分析、数据挖掘与机器学习。数据分析主要使用 Hive、Spark SQL 等 SQL 引擎完成&#xff1b;数据挖…

LaTeX 学习 第2节 数学结构

----用教授的方式学习 目录 2.1 上标与下标 2.2 上下画线与花括号 2.3 分式 2.4 根式 2.5 矩阵 ​​​​​​​LaTex安装包&#xff1a;https://download.csdn.net/download/weixin_38135241/89416392 LaTex- windows安装包&#xff1a;https://download.csdn.net/down…