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

news2024/11/25 17:41:59

前言:在前面我们学习了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的模拟实现.


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


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

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

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

相关文章

liunx常见指令

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 二、安装环境 1.租借服务器 2.下载安装 XShell 3.使用xshll登录服务器 三、Linux基础命令 一、文件和命令 ​编辑1、cd 命令 2、pwd 命令 3、ls 命令 4、cp 命令 …

【three.js案例一】智慧星球

直接附上源码: import * as THREE from three; import { OrbitControls } from three/addons/controls/OrbitControls.js;//场景 const scene = new THREE.Scene();const geometry = new THREE.SphereGeometry(50,32,16);console.log(.postion,geometry.attributes.position)…

上网行为管理产品有哪些?好用的四款上网行为管理产品

上网行为管理产品是现代企业网络安全架构中的重要组成部分&#xff0c;它们旨在帮助企业有效监控、管理和控制员工的网络使用行为&#xff0c;确保网络资源的合理利用&#xff0c;保障信息安全&#xff0c;提升工作效率。 以安企神为例&#xff0c;我们将详细介绍它的主要功能…

python保存文件后打不开的原因是什么

引入数据集&#xff0c;奇怪的是怎么也打不开&#xff0c;显示不存在这个文件&#xff1a; 但是&#xff0c;我将文件改个名字&#xff0c;就打开了&#xff0c;难道csv的文件命名必须有一定合法性&#xff1f; import pandas users pandas.read_csv("H:\python\data an…

OpenDevin 环境配置及踩坑指南

不惧怕任何环境配置 首先 clone 项目&#xff0c;然后查看开发者文档&#xff1a;https://github.com/OpenDevin/OpenDevin/blob/main/Development.md make setup-config 自定义 LLM 配置 首先这个 devin 写的是支持自定义的 LLM 配置&#xff0c;并且提供了交互式命令供我们…

华为云计算和数通有什么用?大咖在这里为你讲解

网工这一职业的就业前景&#xff0c;是一直以来都被看好的。薪资水平普遍较高&#xff0c;随着经验的积累&#xff0c;薪资水平还会不断提升&#xff0c;职业发展路径也非常广阔。 谈到网工&#xff0c;就绕不开华为认证&#xff0c;华为认证作为网络工程师的一块金字招牌&…

mini web框架示例

web框架&#xff1a; 使用web框架专门负责处理用户的动态资源请求&#xff0c;这个web框架其实就是一个为web服务器提供服务的应用程序 什么是路由&#xff1f; 路由就是请求的url到处理函数的映射&#xff0c;也就是说提前把请求的URL和处理函数关联好 管理路由可以使用一个…

MySQL 中 Varchar(50) 和 varchar(500) 区别是什么?

一. 问题描述 我们在设计表结构的时候&#xff0c;设计规范里面有一条如下规则: 对于可变长度的字段&#xff0c;在满足条件的前提下&#xff0c;尽可能使用较短的变长字段长度。 为什么这么规定&#xff1f;我在网上查了一下&#xff0c;主要基于两个方面 基于存储空间的考…

Springboot实现微信小程序登录功能

目录 一 什么是微信登录功能 二 实现微信登录功能的整体逻辑 三 微信登录功能实现步骤 一 什么是微信登录功能 微信小程序登录功能一般用于开发微信小程序的时候&#xff0c;我们需要使用微信授权登录我们的微信小程序&#xff0c;本篇博客就微信小程序实现微信授权登录以及s…

Javaweb8 数据库Mybatis+JDBC

Mybatis Dao层&#xff0c;用于简化JDBC开发 1步中的实体类 int类型一般用Integer &#xff1a;如果用int类型 默认值为0,会影响数据的判断,用Integer默认值是null,不会给数据的判断造成干扰 2.在application .properties里配置数据库的链接信息-四要素 #驱动类名称 #URL #用…

stm32f103 HAL库 HC-SR04测距

目录 一、实现测距二、添加TIM3控制LED根据距离以不同频率闪烁三、观察时序Modebus协议12路超声波雷达设计方案1. 系统架构设计2. 硬件设计3. 软件设计4. 通信协议设计5. 用户接口6. 安全和冗余7. 测试和验证8. 电源和物理封装9. 文档和支持 一、实现测距 配置时钟 配置定时器…

0-1 构建用户画像数仓

目录 前言 一、用户画像概述 1.1 用户画像 1.2 用户标签 1.3 用户群组 二、建设标签和标签体系 2.1 标签体系 2.1.1 统计类标签 2.1.2 规则类标签 2.1.3 机器学习挖掘类标签 2.2 标签建设流程 2.2.1 需求收集与分析 2.2.2 产出标签需求文档 2.2.3 标签的开发 H…

docker安装消息队列mq中的rabbit服务

在现代化的分布式系统中&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;已经成为了一种不可或缺的组件。RabbitMQ作为一款高性能、开源的消息队列软件&#xff0c;因其高可用性、可扩展性和易用性而广受欢迎。本文将详细介绍如何在Docker环境中安装RabbitMQ服务…

04-appium元素定位

一、uiautomatorviewer uiautomatorviewer是Android-SDK自带的一个元素定位工具&#xff0c;非常简单好用&#xff0c;可以使用该工具查看app应用中的元素属性&#xff0c;帮助我们在代码中进行元素定位。 1&#xff09;使用步骤 在Android-SDK安装目录中进入到 android-sdk-…

【TB作品】STM32F102C8T6单片机,PWM发生器

硬件&#xff1a; STM32F102C8T6核心板&#xff0c;按键&#xff0c;0.96 OLED显示屏。 软件&#xff1a; 1、硬件启动触发单片机输出PWM&#xff0c;未触发之前PWM输出为低电平。 2、按键修改PWM的变化模式、变化时间长度、占空比上下限。 3、输出的PWM是固定的10kHZ的。 4、变…

Redis的安装(linux、docker)与其基本的api使用

一、Redis简介 Redis是一个开源的&#xff0c;使用 C 编写&#xff0c;高性能的Key-Value的NoSQL数据库。 SQL &#xff1a;关系型数据库&#xff0c;例如&#xff1a;MySQL&#xff0c;Oracle等等NoSQL &#xff1a;Not Only SQL 不仅仅是SQL&#xff0c;表示是非关系型数据库…

【漏洞复现】东胜物流软件 GetProParentModuTreeList SQL注入漏洞

0x01 产品简介 东胜物流软件是青岛东胜伟业软件有限公司-款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司)&#xff0c;专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS…

Canvas绘制老友记时钟

Canvas绘制老友记时钟 前言 一直做3D/2D可视化&#xff0c;Canvas API和三角函数&#xff0c;空间几何是基础。在官网上看了一遍Canvas API之后&#xff0c;决定绘制一个老友记时钟来巩固知识点&#xff0c;本文用实际代码讲解绘制过程。 代码 HTML <canvas id"myC…

C++ 30 之 new 和 delete 关键字

#include <iostream> #include <string.h> using namespace std;class Students08{ public:Students08(){cout << "students08的默认构造函数"<< endl;}Students08(int a){cout << "students08的有参构造函数"<< endl…

永磁同步直线电机(PMLSM)控制与仿真1-永磁同步直线电机数学模型

文章目录 1、引言2、永磁同步直线电机数学模型2.1 直线电机的结构和工作原理2.2 永磁同步直线电机系统干扰分析2.2.1 齿槽效应2.2.2 端部效应 2.3 永磁同步直线电机的结构2.4 永磁同步直线电机的数学模型2.4.1 ABC坐标系下 PMLSM 的数学模型2.4.2 dq坐标系下 PMLSM 的数学模型2…