【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.hqwc.cn/news/624349.html

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

相关文章

tailwindcss在manoca在线编辑智能感知

推荐一下monaco-tailwindcss库&#xff0c;它实现在monaco-editor网页在线编辑器中对tailwindcss的智能感知提示&#xff0c;在利用tailwindcss实现html效果布局。非常的方便。 生成CSS

freertos作业day1

1.总结keil5下载代码和编译代码需要注意的事项 1.&#xff09;仿真器设置&#xff1a; 点击魔术棒&#xff0c;选择debug选项&#xff0c;找到使用的仿真器&#xff0c;选择ST-LINK仿真器&#xff0c;点击setting&#xff0c;选择flash download ,勾选reset and run,选择pack…

基于zookeeper安装Kafka集群

操作系统&#xff1a;centOS 9 Stream&#xff0c;6台&#xff0c;基于vmware虚拟机创建 准备工作 确认系统环境&#xff1a; 确保所有服务器已安装了最新更新。安装Java Development Kit (JDK) 8或更高版本&#xff0c;因为ZooKeeper和Kafka都是基于Java开发的。例如&#x…

PaddleOCR训练自己模型(2)----参数配置及训练

一、介绍 paddleocr分为文字定位(Det)和文字识别(Rec)两个部分 二、定位模型训练 &#xff08;1&#xff09;Det预训练模型下载&#xff1a;https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_train.tar &#xff08;2&#xff09;下载完之后&#xff0c;…

案例研究|众乐邦将MeterSphere持续测试平台融入DevOps流水线

众乐邦网络科技有限公司&#xff08;以下简称为“众乐邦”&#xff09;是一家企业服务公司。其旗下的众乐邦灵活用工数字化薪税管理平台&#xff08;以下简称为灵活用工管理平台&#xff09;&#xff0c;以财税服务视角切入灵活用工场景&#xff0c;连接企业、灵活就业者和监管…

家居网购项目(手写分页)

文章目录 1.后台管理—分页显示1.程序框架图2.编写数据模型Page.java 3.编写dao层1.修改FurnDao增加方法 2.修改FurnDaoImpl增加方法 3.单元测试FurnDaoTest 4.编写service层1.修改FurnService增加方法 2.修改FurnServiceImpl增加方法3.单元测试FurnServiceTest 5.编写DataUtil…

pytorch 今日小知识3——nn.MaxPool3d 、nn.AdaptiveAvgPool3d、nn.ModuleList

MaxPool3d — PyTorch 2.2 documentation 假设输入维度&#xff08;1,2,3,4,4&#xff09; maxpool torch.nn.MaxPool3d(kernel_size(2, 2, 2), stride(2, 2, 2), padding(1, 0, 0))F 维的 kernel_size 为 2&#xff0c;说明在 F 维的覆盖的 frame 数为 2&#xff0c;也就是…

什么是上位机?入门指南

什么是上位机&#xff1f; 上位机&#xff08;SCADA&#xff0c;Supervisory Control and Data Acquisition&#xff09;是一种软件系统&#xff0c;用于监控和控制工业过程中的设备。它通常与传感器、执行器和其他自动化设备一起工作&#xff0c;以实时地监视过程状态、收集数…

JavaScript 高性能编程 —— 加载和运行

JavaScript 在浏览器中的性能,可认为是开发者所要面对的最重要的可用性问题。此问题因 JavaScript 的阻塞特征而复杂,也就是说,当 JavaScript 运行时其他的事情不能被浏览器处理。 事实上,大多数浏览 器使用单进程处理 UI 更新和 JavaScript 运行等多个任务,而同一时间只能…

正在海外乘风破浪的扫地机器人,手握怎样的发展利器?

“懒人经济”能造就多大的市场&#xff0c;可以从扫地机器人行业的发展窥见。 据国际数据分析机构捷孚凯报告&#xff0c;截至2022年底&#xff0c;我国扫地机器人已占据50%以上的海外市场份额。其中&#xff0c;科沃斯、石头科技等头部企业成为出海的“主力军”。 以石头科技…

C语言【整数与浮点数的存储区别】

例题引入 #include <stdio.h> int main() {int n 9;float* pFloat (float*)&n;printf("n的值为&#xff1a;%d\n",n);printf("*pFloat的值为&#xff1a;%f\n",*pFloat);*pFloat 9.0;printf("num的值为&#xff1a;%d\n",n);print…

【十一】MyBatis Plus 原理分析

MyBatis Plus 原理分析 摘要 Java EE开发中必不可少ORM框架&#xff0c;目前行业里最流行的orm框架非Mybatis莫属了&#xff0c;而Mybatis框架本身没有提供api实现&#xff0c;所以市面上推出了Mybatis plus系列框架&#xff0c;plus版是mybatis增强工具&#xff0c;用于简化My…