【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.mfbz.cn/a/549522.html

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

相关文章

共享桌面,3分钟自己实现一个吧,还能听见麦克风声音哦

前言 关于【SSD系列】&#xff1a; 前端一些有意思的内容&#xff0c;旨在3-10分钟里&#xff0c; 500-1000字&#xff0c;有所获&#xff0c;又不为所累。 共享桌面程序&#xff0c;哇&#xff0c;高大尚耶&#xff01;其实不然&#xff0c;让我带你3分钟实现桌面共享程序&am…

【Entity Framework】你知道如何处理无键实体吗

【Entity Framework】你知道如何处理无键实体吗 文章目录 【Entity Framework】你知道如何处理无键实体吗一、概述二、定义无键实体类型数据注释 三、无键实体类型特征四、无键实体使用场景五、无键实体使用场景六、无键使用示例6.1 定义一个简单的Blog和Post模型&#xff1a;6…

sqlilabs靶场1—20题学习笔记(思路+解析+方法)

前几个题目较为简单&#xff0c;均尝试使用各种方法进行SQL注入 第一题 联合查询 1&#xff09;思路&#xff1a; 有回显值 1.判断有无注入点 2.猜解列名数量 3.判断回显点 4.利用注入点进行信息收集 爆用户权限&#xff0c;爆库&#xff0c;爆版本号 爆表&#xff0c;爆列&…

AI 领域精选高质量信息源分享

我在这篇 ChatGPT 发布一周年的总结文章中大模型时代&#xff0c;程序员如何实现自我成长&#xff1f;——一名普通开发者的 ChatGPT 一周年记&#xff0c;已经推荐了不少优质的信息源&#xff0c;但主要还是偏技术向&#xff0c;随着我自己的身份从纯研发角色转变为产品&#…

【Linux】服务器硬件及RAID配置实战

目录 一、服务器 1.服务器 2.查看服务器信息 二、RAID 磁盘阵列 三、软RAID的创建和使用 1.添加硬盘&#xff0c;fdisk分区&#xff0c;分区类型ID设置为 fd 2.使用mdadm创建软raid 3.格式化 4.挂载使用 5.mdadm 一、服务器 1.服务器 分类机架式居多 塔…

Qt | 事件第二节

Qt | 事件第一节书接上回 四、事件的接受和忽略 1、事件可以被接受或忽略,被接受的事件不会再传递给其他对象,被忽略的事件会被传递给其他对象处理,或者该事件被丢弃(即没有对象处理该事件) 2、使用 QEvent::accept()函数表示接受一个事件,使用 QEvent::ignore()函数表示…

牛客网刷题 | BC51 及格分数

描述 KiKi想知道他的考试分数是否通过&#xff0c;请帮他判断。从键盘任意输入一个整数表示的分数&#xff0c;编程判断该分数是否在及格范围内&#xff0c;如果及格&#xff0c;即&#xff1a;分数大于等于60分&#xff0c;是输出“Pass”&#xff0c;否则&#xff0c;输出“…

【Entity Framework】你必须要了解EF中数据查询之数据加载

【Entity Framework】你必须要了解EF中数据查询之数据加载 文章目录 【Entity Framework】你必须要了解EF中数据查询之数据加载一、概述二、预先加载2.1 包含多个层级2.2 经过筛选的包含 三、显示加载3.1查询关联实体 四、延时加载4.1 不使用代理进行延迟加载 一、概述 Entity…

数据分析(2)

数据分析&#xff08;2&#xff09; 本文介绍pandas的另一种数据类型DataFrame,中文叫数据框 DataFrame 定义&#xff1a; DataFrame是一个二维的矩阵数据表&#xff0c;通过行和列&#xff0c;可以定位一个值。 在某种程度上&#xff0c;可以认为DataFrame是“具有相同ind…

自定义类型: 结构体 (详解)

本文索引 一. 结构体类型的声明1. 结构体的声明和初始化2. 结构体的特殊声明3. 结构体的自引用 二. 结构体内存对齐1. 对齐规则2. 为啥存在对齐?3. 修改默认对齐值 三. 结构体传参四. 结构体实现位段1. 什么是位段?2. 位段的内存分配3. 位段的应用4. 位段的注意事项 ​ 前言:…

Python leetcode 2906 构造乘积矩阵,力扣练习,矩阵递推,经典递推题目,递推代码实战

leetcode 2906 构造乘积矩阵&#xff0c;矩阵递推 1.题目描述 给你一个下标从 0 开始、大小为 n * m 的二维整数矩阵 grid &#xff0c;定义一个下标从 0 开始、大小为 n * m 的的二维矩阵 p。如果满足以下条件&#xff0c;则称 p 为 grid 的 乘积矩阵 &#xff1a; 对于每个元…

JavaWeb前端/后端开发规范——接口文档概述及YApi平台的使用

前言&#xff1a; 整理下笔记&#xff0c;打好基础&#xff0c;daydayup!!! 接口文档 什么是接口文档&#xff1f; 目前主流的开发模式为前后端分离式开发&#xff0c;为了方便前后端的对接&#xff0c;就需要使用接口文件进行统一规范。 接口文档记载什么信息&#xff1f; 1&…

Mac搭建Java环境【环境搭建】

Mac搭建Java环境【环境搭建】 1 安装Java SDK 官网地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ 下载dmg&#xff0c;双击之后无脑安装即可。 # 进入 JDK 安装目录 cd /Library/Java/JavaVirtualMachines# 查看文件 ls# 输入 cd ~# 打开环…

短剧分销系统:引领影视娱乐新潮流,开启内容变现全新模式!

近年来&#xff0c;随着互联网的飞速发展和人们生活节奏的加快&#xff0c;短剧项目在我国逐渐崭露头角&#xff0c;并在短时间内吸引了大量观众和投资者的目光。短剧以其时长短、剧情紧凑、制作精良等特点&#xff0c;迅速在视频市场中占据了一席之地。 一、短剧项目发展现状…

vue学习日记22:非父子通信(拓展)-provideinject

一、概念 二、实践 代码 App <template><div class"app">我是APP组件<button click"change">修改数据</button><SonA></SonA><SonB></SonB></div> </template><script> import SonA …

【C++进阶】详解C++类型转换IO流

C类型转换及IO流 一&#xff0c;C语言的类型转换方式二&#xff0c;C的四种强制类型转换方式2.1 static_cast2.2 reinterpret_cast2.3 const_cast2.4 dynamic_cast 三&#xff0c;C语言的输入和输出四&#xff0c;C的标准IO流五&#xff0c;C文件IO流总结 这一节我们来讲解 C的…

`Spring Cloud OpenFeign`底层实现原理

Spring Cloud OpenFeign工作原理 一 、简介 OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解&#xff0c;如RequesMapping等等。 OpenFeign的FeignClient可以解析SpringMVC的RequestMapping注解下的接口&#xff0c;并通过动态代理的方式产生实现类&#xff…

【Git】初识 Git

文章目录 1. 提出问题2. 如何解决&#xff1f;版本控制器3. 注意事项 1. 提出问题 不知道你工作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;我们在编写各种文档时&#xff0c;为了防止文档丢失、更改失误、失误后能恢复到原来的版本&#xff0c;不得不复制出一个副…

Apifox接口测试教程(一)接口测试的原理与工具

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

「GO基础」GO程序组成要素

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…