【C++】开始使用stack 与 queue

在这里插入图片描述

送给大家一句话:
忍受现实给予我们的苦难和幸福,无聊和平庸。 – 余华 《活着》


开始使用queue 与 stack

  • 1 前言
  • 2 stack与queue
    • 2.1 stack 栈
    • 2.2 queue 队列
    • 2.3 使用手册
  • 3 开始使用
    • Leetcode 155.最小栈
    • 牛客 JZ31 栈的弹出压入序列
    • Leetcode 150.逆波兰表达式求值
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

1 前言

在之前的学习中,我们已经对 STL 模板中的 string list vector 等容器进行了详细的探讨,从而获得了对这些容器操作的清晰理解。基于这些知识,现在转向学习 stack(栈) 和 queue(队列)就显得相对简单了。然而,在有效使用这两种容器之前,我们还需要对它们的工作原理和使用场景有一个系统的了解。这样,我们才能更加准确地应用这些数据结构来解决实际问题。

2 stack与queue

2.1 stack 栈

stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。类似与向箱子里放入取出物品,只能一端进行操作

stack是作为容器适配器( 一种设计模式 )被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定
的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。

stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下
操作:

  • empty:判空操作
  • back:获取尾部元素操作
  • push_back:尾部插入元素操作
  • pop_back:尾部删除元素操作

标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque

2.2 queue 队列

队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端
提取元素。类似与排队打饭,只能从尾端进入,从头离开。

队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的
成员函数来访问其元素。元素从队尾入队列,从队头出队列。

底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操
作:

  • empty:检测队列是否为空
  • size:返回队列中有效元素的个数
  • front:返回队头元素的引用
  • back:返回队尾元素的引用
  • push_back:在队列尾部入队列
  • pop_front:在队列头部出队列

标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque

2.3 使用手册

stack手册 和 queue手册
通过手册我们可以发现基本接口是一样的:

stack栈:

函数说明接口说明
empty()检测stack是否为空
size()返回stack中元素的个数
top()返回栈顶元素的引用
push()将元素val压入stack中
pop()将stack中尾部的元素弹出

queue 队列:

函数声明接口说明
empty()检测队列是否为空,是返回true,否则返回false
size()返回队列中有效元素的个数
front( )返回队头元素的引用
back()返回队尾元素的引用
push()在队尾将元素val入队列
pop()将队头元素出队列

3 开始使用

接下来我们在解题中体会stack与queue的使用方法

Leetcode 155.最小栈

链接:最小栈
题目描述
在这里插入图片描述
这道题看起来很简单奥,我们需要模拟一个特殊的栈:可以获取到栈中的最小元素。
我们解决的办法也很直接了当,我们建立两个栈_st 和_minst,一个用来记录栈中的所以元素,一个来记录当前最小值。这个记录当前最小值只需要在插入元素时判断插入的元素是否小于当前栈中的最小值(也就是_minst中的top()元素)
也就是我们需要对插入与删除进行特殊处理,其余部分与普通的栈区别不大。
PS: 不敢想象如果使用C语言搓轮子会是多么费劲!!!

class MinStack {
public:MinStack() {}void push(int val) {_st.push(val);if(_minst.empty() || val <= _minst.top()){_minst.push(val);}}void pop() {if(_st.top() == _minst.top()){_st.pop();_minst.pop();}else{_st.pop();}}int top() {return _st.top();}int getMin() {return _minst.top();}private:stack<int> _st;stack<int> _minst;
};

牛客 JZ31 栈的弹出压入序列

上链接!!!栈的弹出压入序列
题目描述
在这里插入图片描述
这个题目比较好理解,我们需要通过一个插入序列,来判断弹出序列可不可以通过插入序列来获取。
思路也比较简单,我们只需模拟弹出过程即可:

  1. 首先创建一个栈
  2. 依照插入序列来插入元素
  3. 检查当前栈顶元素是否等于弹出序列的首元素(一样说明该弹出了)
  4. 重复 3 操作直到不一致为止,然后进行2 - 3 操作
class Solution {
public:bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {// 使用两个下表来进行两个序列的读取int pushi = 0, popi = 0;stack<int> st ;//所有元素全部插完为止while(pushi < pushV.size()){//插入一个st.push(pushV[pushi]);//检查是否一致,一致就弹出while(!st.empty() && st.top() == popV[popi] ){popi++;st.pop();}pushi++;}//最后进行判断if(st.empty()) return true;else return false;}
};

Leetcode 150.逆波兰表达式求值

题目描述
在这里插入图片描述

我们先来认识一下逆波兰表达式:也被称为后缀表达式,是一种非常巧妙的数学表达式写法。在这种表达式中,运算符位于所有操作数的后面,这种布局使得表达式的计算不再需要括号来指示运算的优先级。逆波兰表达式的一个典型特点是其清晰的运算顺序——从左到右,这使得计算过程变得直观且易于通过计算机算法实现。

但为什么我们需要逆波兰表达式呢?主要是因为它极大地简化了计算机程序对表达式的处理。在传统的中缀表达式中,计算机需要处理复杂的优先级和括号,而逆波兰表达式通过其后缀形式自然地避免了这些复杂性。这不仅提高了计算效率,还减少了程序运行过程中的错误可能性。
因此,在很多需要快速且准确计算的领域,如编译器的设计和科学计算中,逆波兰表达式都发挥了不可替代的作用

而这道题我们需要模拟计算逆波兰表达式,我们就要先知道逆波兰表达式是如何计算的:
举个例子:
输入:tokens = [“2”,“1”,“+”,“3”,“*”]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

这是如何做到的:
在这里插入图片描述
也就是:

  1. 依次读入数字 (压入栈中)
  2. 读到运算符就进行运算(取出栈前两个数字来进行相应运算)
  3. 然后再储存运算结果(压入栈中)
  4. 依次重复 1 - 3 操作
class Solution {
public:int evalRPN(vector<string>& tokens) {stack<string> st;int i = 0;while(i != tokens.size()){string tmp = tokens[i];//枚举运算符,反正运算符就那些if(tmp.size() == 1 && (tmp[0] == '*' || tmp[0] == '/' || tmp[0] == '-' || tmp[0] == '+')){int n1 = stoi(st.top());st.pop();int n2 = stoi(st.top());st.pop();//直接枚举运算符switch(tmp[0]){//注意数字顺序很重要!!!case '*': n2 *= n1;break;case '/': n2 /= n1;break;case '+': n2 += n1;break;case '-': n2 -= n1;break;default : break;}//压入计算结果st.push(to_string(n2));i++;}else{st.push(tokens[i]);i++;}}return stoi(st.top());}
};

队列的相关习题大部分是子啊BFS中使用,这里就不在说明了

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++内存分布

C代码编译过程 预处理 宏定义展开、头文件展开、条件编译&#xff0c;这里并不会检查语法编译检查语法&#xff0c;将预处理后文件编译生成汇编文件汇编将汇编文件生成目标文件(二进制文件)链接将目标文件链接为可执行程序 进程的内存分布 程序运行起来(没有结束前)就是一个…

Linux 硬链接和软链接怎么区分使用?

一、什么是硬链接和软链接 硬链接 在Linux操作系统中&#xff0c;硬链接相当于存储在硬盘驱动器中的文件&#xff0c;它实际上引用或指向硬盘驱动器上的某个点。硬链接是原始文件的镜像副本。 硬链接与软链接的区别在于&#xff0c;删除原始文件不会影响硬链接&#xff0c;但…

普通人做抖音小店真的能赚钱吗?可以,但更取决于个人

大家好&#xff0c;我是电商花花。 现在做抖音小店的基本上都是一些新商家&#xff0c;对于我们众多零基础的朋友来说&#xff0c;是期待也是一份挑战。 抖音小店作为一个充满机会的新兴平台&#xff0c;许多人都欣喜的投入其中&#xff0c;期望能够借此来改变自己的命运&…

跟TED演讲学英文:Why AI will spark exponential economic growth by Cathie Wood

TED英文文稿 文章目录 TED英文文稿Why AI will spark exponential economic growthIntroductionVocabularyTranscriptSummary后记 Why AI will spark exponential economic growth Link: https://www.ted.com/talks/cathie_wood_why_ai_will_spark_exponential_economic_growth…

微信小程序兼容iphone适配安全区域

背景&#xff1a; 小程序页面底部在ios中会有小黑条遮挡 上代码&#xff1a; padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */ padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS > 11.2 */ 项目描述&#xff1a; 微信小程序是通过…

02_对象树

#include "mypushbutton.h" #include <QDebug>MyPushButton::MyPushButton(QWidget *parent): QPushButton(parent) {qDebug()<<"我的按钮类构造调用"; }MyPushButton::~MyPushButton() {qDebug()<<"我的按钮类析构调用"; }交…

未来汽车硬件安全的需求(2)

目录 4.汽车安全控制器 4.1 TPM2.0 4.2 安全控制器的硬件保护措施 5. EVITA HSM和安全控制器结合 6.小结 4.汽车安全控制器 汽车安全控制器是用于汽车工业安全关键应用的微控制器。 他们的保护水平远远高于EVITA HSM。今天的典型应用是移动通信&#xff0c;V2X、SOTA、…

python 如何安装nltk

1、在cmd窗口中&#xff0c;进入到python的文件夹中的Scripts内&#xff0c;我的目录地址是&#xff1a;D:\Python\Scripts。 在命令行输入&#xff1a; easy_install pip2、运行结束后&#xff0c;安装PyYAML and NLTK &#xff0c;在命令行输入&#xff1a; pip install pyya…

电商技术揭秘九:搜索引擎中的SEO数据分析与效果评估

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台的个性…

深度挖掘响应式模式的潜力,从而精准优化AI与机器学习项目的运行效能,引领技术革新潮流

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f525; 转载自热榜文章&#xff1a;探索设计模式的魅力&#xff1a;深度挖掘响应式模式的…

深度解析 Spark(进阶):架构、集群运行机理与核心组件详解

关联阅读博客文章&#xff1a;深度解析SPARK的基本概念 引言&#xff1a; Apache Spark作为一种快速、通用、可扩展的大数据处理引擎&#xff0c;在大数据领域中备受关注和应用。本文将深入探讨Spark的集群运行原理、核心组件、工作原理以及分布式计算模型&#xff0c;带领读者…

基于单链表实现通讯管理系统!(有完整源码!)

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;C语言实战项目 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、前言 友友们&#xff0c;这篇文章是基于单链…

JavaScript基础:js介绍、变量、数据类型以及类型转换

目录 介绍 引入方式 内部方式 外部形式 注释和结束符 单行注释 多行注释 结束符 输入和输出 输出 输入 变量 声明 赋值 关键字 变量名命名规则 常量 数据类型 数值类型 字符串类型 布尔类型 undefined 类型转换 隐式转换 显式转换 Number ✨介绍 &a…

数字IC/FPGA——亚稳态及跨时钟域

什么是亚稳态亚稳态会造成什么平均故障间隔时间如何解决亚稳态同步时钟和异步时钟单bit电平信号如何跨时钟域单bit脉冲信号如何跨时钟域多bit信号如何跨时钟域 目录 一、亚稳态1.基本概念2.危害3.平均故障时间4.解决亚稳态的方法 二、跨时钟域1.同步电路和异步电路&#xff08;…

模板初阶的学习

目录&#xff1a; 一&#xff1a;泛型模板 二&#xff1a;函数模板 三&#xff1a;类模板 1&#xff1a;泛型模板 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。模板是泛型编程的基础。 以交换函数为列进行讲解&#xff1a; void Swap(…

【ENSP】华为三层交换机配置AAA认证,开启telnet服务

配置步骤 1.给交换机配置ip地址&#xff0c;以便登陆 2.配置AAA&#xff0c;用户名&#xff0c;密码&#xff0c;服务类型&#xff0c;用户权限 3.配置接入设备的数量 4.开启telnet服务 LSW2交换机配置 u t m #关闭提示 sys …

JVM主要知识点详解

目录 1. 性能监控和调优 1.1 调优相关参数 1.2 内存泄漏排查 1.3 cpu飙⾼ 2. 内存与垃圾回收 2.1JVM的组成&#xff08;面试题&#xff09; 2.2 Java虚拟机栈的组成 2.3 本地方法栈 2.4 堆 2.5 方法区&#xff08;抽象概念&#xff09; 2.5.1 方法区和永久代以及元空…

如何利用纯前端技术,实现一个网页版视频编辑器?

纯网页版视频编辑器 一、前言二、功能实现三、所需技术四、部分功能实现4.1 素材预设4.2 多轨道剪辑 一、前言 介绍&#xff1a;本篇文章打算利用纯前端的技术&#xff0c;来实现一个网页版的视频编辑器。为什么突然想做一个这么项目来呢&#xff0c;主要是最近一直在利用手机…

【机器学习】Logistic与Softmax回归详解

在深入探讨机器学习的核心概念之前&#xff0c;我们首先需要理解机器学习在当今世界的作用。机器学习&#xff0c;作为人工智能的一个重要分支&#xff0c;已经渗透到我们生活的方方面面&#xff0c;从智能推荐系统到自动驾驶汽车&#xff0c;再到医学影像的分析。它能够从大量…

服务器Linux搭建NPM私有仓库

服务器Linux搭建NPM私有仓库 环境搭建 安装 nodejs nodejs官网&#xff1a;https://nodejs.org/en/download/package-manager 可以去官网自行下载nodejs的Linux版本&#xff0c;但是出于别的原因考虑&#xff0c;可以使用nvm去下载nodejs这样会切换nodejs也方便。 nvm 这…