【STL栈和队列】:高效数据结构的应用秘籍

前言:

C++ 标准模板库(STL)为我们提供了多种容器,其中 stack(栈)和 queue(队列)是非常常用的两种容器。

根据之前C语言实现的栈和队列,(如有遗忘,请回去看看【数据结构】— 栈和队列-CSDN博客)我们知道一些栈和队列的逻辑,现在就来学习C++STL中的栈和队列。


一、栈

在这里插入图片描述

​ 首先,STL中的栈是基于容器适配器实现的,默认容器是deque。

使用栈需要包含头文件:

#include<stack>

1.1 栈的基本操作

​ 先看一下,栈提供的接口函数

在这里插入图片描述

常用方法

  • push(): 将元素 val 压入栈顶。
  • pop(): 移除栈顶元素。
  • top(): 返回栈顶元素(但不移除)。
  • empty(): 判断栈是否为空。
  • size(): 返回栈的元素数量。

1.2 栈的使用

现在简单使用一下stack:

void test_stack() {//创建一个栈——存储整形stack<int> s;  //入栈s.push(1);s.push(2);s.push(3);//栈中元素cout << "元素个数: " << s.size() << endl;//栈顶元素cout << "栈顶元素: " << s.top() << endl;//出栈s.pop();//依次输出栈中的数据while (!s.empty()) {cout << s.top() << " ";s.pop();}cout << endl;return 0;
}

输出结果

元素个数: 3
栈顶元素: 3
2 1

1.3 应用实例:点击消除

栈可以用来解决括号匹配这一类的问题。

​ 括号匹配之前已经做过了,这里来用栈做这样的一道题:点击消除_牛客题霸_牛客网

题目描述:

在这里插入图片描述

​ 这题思路比较简单,就是遍历字符串时,不断入栈,出栈(字符串中字符与栈顶元素相等);最后输出即可。

需要注意的是:这里使用数组来模拟栈,方便输出

​ 当然也可以使用栈,不过输出时顺序是反的,需要进行处理。

#include <iostream>
using namespace std;int main() {string str;cin>>str;string ret;for(auto ch: str){if(ret.size()==0||ret[ret.size()-1]!=ch){ret.push_back(ch);}else {ret.pop_back();}}if(ret.empty()){cout<<'0';return 0;}cout<<ret;return 0;
}

二、队列

2.1 队列的基本操作

STL 中的队列(queue)也是一种容器适配器,默认底层容器也是 deque

使用栈需要包含头文件:

#include<queue>

在这里插入图片描述

常用方法

  • push(): 将元素 val 插入队尾。
  • pop(): 移除队头元素。
  • front(): 返回队头元素(不移除)。
  • back(): 返回队尾元素(不移除)。
  • empty(): 判断队列是否为空。
  • size(): 返回队列的元素数量。

2.2 队列的使用

简单使用一下队列:

void test_queue()
{//创建一个队列——存储整型queue<int> q;//入队列q.push(10);q.push(20);q.push(30);cout << "数据个数: " << q.size() << endl;cout << "队头元素: " << q.front() << endl;cout << "队尾元素: " << q.back() << endl;//出队列q.pop();cout << "队列中数据: ";while (!q.empty()) {cout << q.front() << " ";q.pop();}cout << endl;
}

输出结果

数据个数: 3
队头元素: 10
队尾元素: 30
队列中数据: 20 30

2.3 应用实例:简单的任务调度

队列可以用于实现简单的任务调度。假设有一系列任务需要按顺序执行,我们可以使用队列来管理任务的执行顺序。

#include <iostream>
#include <queue>
#include <string>
using namespace std;int main() {queue<string> tasks;// 添加任务tasks.push("任务1: 下载文件");tasks.push("任务2: 解压文件");tasks.push("任务3: 处理数据");// 模拟任务调度while (!tasks.empty()) {cout << "正在执行 -> " << tasks.front() << endl;tasks.pop();}return 0;
}

输出结果

rust复制代码正在执行 -> 任务1: 下载文件
正在执行 -> 任务2: 解压文件
正在执行 -> 任务3: 处理数据

三、双端队列(deque)的栈和队列操作

deque(双端队列)既可以当作栈,也可以当作队列使用。我们可以在双端队列的两端进行插入和删除操作,从而更灵活地实现栈和队列的功能。

对于双端队列,简单来说,就是可以像vector那样随机访问,也可以像链表那样随机位置插入;但是,效率很低,(个人感觉,就是为了给stackqueue作默认容器适配器来用的。

这里就不过多描述双端队列了,感兴趣可以去看一下源码学习学习。


总结

eque`(双端队列)既可以当作栈,也可以当作队列使用。我们可以在双端队列的两端进行插入和删除操作,从而更灵活地实现栈和队列的功能。

对于双端队列,简单来说,就是可以像vector那样随机访问,也可以像链表那样随机位置插入;但是,效率很低,(个人感觉,就是为了给stackqueue作默认容器适配器来用的。

这里就不过多描述双端队列了,感兴趣可以去看一下源码学习学习。


总结

在 C++ 中,stackqueue 是非常有用的数据结构,分别实现了后进先出和先进先出的操作模式。通过合理地使用栈和队列,我们可以简化很多问题的解决过程,比如括号匹配和任务调度。同时,双端队列(deque)提供了更为灵活的插入和删除操作,可以根据需求同时作为栈和队列使用。
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

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

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

相关文章

香江电器从A股到港股7年漫长上市路,收入后退停滞不前

《港湾商业观察》施子夫 9月29日&#xff0c;湖北香江电器股份有限公司&#xff08;以下简称&#xff0c;香江电器&#xff09;递表港交所引起外界关注&#xff0c;公司的独家保荐机构为国金证券。 回顾香江电器的IPO之旅&#xff0c;可以说是颇为坎坷&#xff0c;多次尝试A股…

从python源码到可自动更新软件

相关阅读 标题链接如何打包python程序为exebczl【auto-py-to-exe 可视化打包python到exe】51CTO ZATA 1. python源码 打包时需要特别注意的源码编写规范 除了基本的 Python 编码规范之外,在准备程序进行打包时,还需要特别注意以下几点: 1.1 依赖管理 确保 requirements.t…

2024智能视觉与数据建模国际学术会议(ICIVD 2024)

重要信息 主会官网&#xff1a;www.iccaid.net 大会时间&#xff1a;2024年12月13-15日 大会地点&#xff1a;中国南昌 大会简介 2024智能视觉与数据建模国际学术会议&#xff08;ICIVD 2024&#xff09;作为第四届计算机图形学、人工智能与数据处理国际学术会议&#xff…

Linux磁盘分区

文章目录 磁盘分区 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Linux专栏&#xff1a;点击 ⏰️创作时间&#xff1a;2024年11月12日13点20分 磁盘分区 MBR 主启动记录分区方案指定了运行BIOS固件的系统上应如何对磁盘进行分区&#xff0c;存在与驱动开…

2. Spring Cloud 微服务基础环境搭建

2. Spring Cloud 微服务基础环境搭建 文章目录 2. Spring Cloud 微服务基础环境搭建前言1. 微服务需求解析2. 具体搭建微服务步骤&#xff1a;2.1 创建父工程 &#xff0c;用于聚合其它微服务模块2.1.1 需求说明/图解2.1.2 具体实现步骤2.1.3 注意事项和具体细节 2.2 创建会员中…

微信朋友圈营销

朋友圈营销4567法则

【赵渝强老师】MySQL InnoDB的表空间

InnoDB存储引擎目前是MySQL默认的存储引擎&#xff0c;它主要由三部分组成&#xff0c;分别是&#xff1a;存储结构、内存结构和线程结构。InnoDB的存储结构又可以分为逻辑存储结构和物理存储结构。InnoDB存储引擎的逻辑存储结构和Oracle大致相同&#xff0c;所有数据都被逻辑地…

docker安装redis

1、拉取镜像 docker pull redis:latest运行之前需要再/data/redis创建redis.conf配置文件 内容如下 # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 #bind 127.0.0.1protected-mode noport 6379tcp-backlog 511requirepass roottimeout 0tcp-keepalive 300daemonize no…

vue项目多入口文件。vue.config.js如何修改配置

我们知道vue项目是单入口。指定一个入口文件去加载他所有的依赖。如果我们希望他有多个入口文件怎么办呢&#xff1f; 我们可以在public下面新建一个html的文件 然后src下新增一个文件夹&#xff0c;用来放APP.vue和 main.js。 然后修改vue.config.js。把他的pages改成2个入…

NCC前端调用查询弹框

系统自带的查询模板 弹框 调启使用默认的 查询模板 是在 单据模板的 列表模板中&#xff0c;有个查询区域 &#xff0c;查询区域就是查询模板内容如果在列表页做客开 新增按钮 调启查询模板 无问题&#xff0c;但是目前需求是需要再卡片页面下调启系统标准的调启模板代码 //调…

SpringBoot中的注解详解(二)

四、Param() &#xff08;mapper包 Dao层&#xff09; Param()&#xff1a; 功能&#xff1a; 用于在Mapper接口的方法参数上标记参数名称&#xff0c;以便在SQL语句中引用这些参数。 参数命名&#xff1a;在Mapper接口的方法参数上使用Param注解&#xff0c;可以为参数指定一…

一文1800字使用Jmeter进行http接口性能测试!

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 为什么要做接口测试&#xff1f; 越底层发现b…

新版flask pin码计算

Python debug pin码计算 需开启debug from flask import Flask app Flask(__name__) app.route("/") def index():return "Hello World" app.run(debugTrue) /console路由填入上方控制台的 PIN 码即可执行 Python 命令 Flask 的 PIN 码计算仅与 werkze…

比 PyTorch 更快的嵌入Python库:FastEmbed

嵌入生成 已成为自然语言处理&#xff08;NLP&#xff09;中不可或缺的一部分。 无论是智能推荐、文本相似度计算&#xff0c;还是聊天机器人&#xff0c;嵌入技术都扮演着重要角色。然而&#xff0c;我们常常会陷入繁重的库和庞大的模型中&#xff0c;耗时费力。 今天&#…

大模型部署解决方案之TorchServe+vLLM

TorchServe 是PyTorch 中将模型部署到生产环境的一个解决方案。它用HTTP 或HTTPS API 封装模型&#xff0c;可以处理多种任务&#xff0c;包括为部署模型分配workers、负责客户端和服务器之间通信等。 10月份发布的TorchServe 0.12 增加了对GenAI的支持&#xff0c;简化了大语…

博弈论(零和博弈)英文版题解

翻译&#xff1a; 假设我们有一个两人零和游戏&#xff0c;每个玩家有两种行动&#xff0c;行收益矩阵如下&#xff1a; 计算行和列玩家的最小最大最优策略以及游戏的价值。 X Y A a11 a12 B a21 a22 选项&#xff1a; 1. 行玩家&#x…

虚拟现实辅助工程技术应用于员工培训

你还在使用传统的入职方法吗&#xff0c;比如印刷指南、演示、课堂培训、讲座等等&#xff1f;是时候改变了。虚拟现实辅助工程技术提供了一个机会&#xff0c;可以让新员工的入职过程更高效、更有趣&#xff0c;也更令人兴奋。想象一下这样一个场景&#xff0c;新员工可以在第…

【健康警钟】胆已切除,生活调理有“胆”更精彩!必看指南!

在现代社会&#xff0c;由于生活习惯、饮食习惯等多种因素&#xff0c;一些人可能不得不面对胆囊切除手术。虽然手术能够有效解决胆囊结石、胆囊炎等问题&#xff0c;但胆囊作为人体的一部分&#xff0c;其功能的丧失无疑会对生活带来一定影响。那么&#xff0c;胆被割了之后&a…

windows NGIMX配置WebSocket反向代理

linux下 据说nginx是要有 stream的模块 Linux安装Nginx步骤之后续&#xff0c;带stream模块-CSDN博客 Nginx从1.3.13版本就开始支持WebSocket linux 下参考如下链接 配置 Nginx 反向代理 WebSocket - 哈喽哈喽111111 - 博客园 (cnblogs.com) SSL的配置参考 【Linux】采用…

三种读取配置文件的方式

在编写JDBC的util包以读取文件时&#xff0c;配置文件的位置会影响其读取方式。当前&#xff0c;默认配置文件直接放置在src文件夹下。 当读取.properties文件代码写法为&#xff1a; Properties props new Properties(); props.load(new FileInputStream("db.propertie…