leetcode150/155. 逆波兰表达式求值、最小栈;剑指 Offer 31. 栈的压入、弹出序列

news2024/11/24 20:47:52

目录

题目链接与简介

题目一

1.算法思路

2.总结心得

3.可执行代码

题目二

1.算法思路

2.总结心得

3.可执行代码

题目三

1.算法思路

2.总结心得

3.可执行代码


题目链接与简介

1.逆波兰表达式求值

2.最小栈

3.剑指 Offer 31. 栈的压入、弹出序列

题目一

LeetCode 150.逆波兰表达式求值


1.算法思路

先看一下示例,其实就是将后缀表达式转为中缀表达式。

思路如下:

  1. 遍历所给字符串数组中,如果是操作数就入栈,如果是操作符就进行处理。
  2. 当碰到操作符时,取出栈顶元素top1和top2,将其运算结果再放入栈中。

2.总结心得

  1. 因为传入的为字符串数组,所以我们要将字符串转整形,使用 stoi() 函数。
  2. 运算是连续的,所以我们可以直接调用push将运算结果放入栈中。

3.可执行代码

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        for(auto e:tokens)
        {
            if (e=="+")
            {
                long long top1=st.top();
                st.pop();
                long long top2=st.top();
                st.pop();
                st.push(top2+top1);
            }
            else if (e=="-")
            {
                long long top1=st.top();
                st.pop();
                long long top2=st.top();
                st.pop();
                st.push(top2-top1);
            }
            else if (e=="*")
            {
                long long top1=st.top();
                st.pop();
                long long top2=st.top();
                st.pop();
                st.push(top2*top1);
            }
            else if (e=="/")
            {
                long long top1=st.top();
                st.pop();
                long long top2=st.top();
                st.pop();
                st.push(top2/top1);
            }
            else
            {
                st.push(stoi(e));
            }
        }
        return st.top();
    }
};

题目二

LeetCode 155.最小栈


1.算法思路

这道题目就是自己设置设置一个具有特殊接口的栈,该接口的功能是可以获得栈中的最小元素.

所以我们的思路就是在类中创建两个栈,一个栈用于正常的存放数据,一个栈用于存放历史以来的最小值。

  1. 入栈时,直接将栈中元素放入st1中;
  2. 如果get_min栈为空,或者是插入的值小于get_min中的值,就往get_min中进行插入。
  3. 出栈时,如果栈不为空,直接删除栈顶元素,
  4. 如果栈顶元素为最小栈中的数据,则最小栈也要进行删除。

2.总结心得

  1. 在插入时,判断当前值是不是最小值要记得判断最小栈是否为空,还要防止二次插入最小值
  2. 应是 val<=get_min.top(),因为是存在最小值相等的情况的。
  3. 删除时,应以栈不为空为前提。

3.可执行代码

MinStack() { }
    
    void push(int val) {
        // 1.直接将栈中元素放入st1中
        // 2.如果get_min栈为空,或者是插入的值小于get_min中的值,就往get_min中进行插入

        st1.push(val);
        if (get_min.empty()) get_min.push(val);
        else if (val<=get_min.top()) get_min.push(val);
    }
    
    void pop() {
        // 1.如果栈不为空,直接删除栈顶元素
        // 2.如果栈顶元素为最小栈中的数据,则最小栈也要进行删除
        if (!st1.empty())
        {
        int temp=st1.top();
        if (get_min.top()==temp) 
            get_min.pop();
            st1.pop();
        }
    }
    
    int top() {
        return st1.top();
    }
    
    int getMin() {
        return get_min.top();
    }
    private:
   stack<int> st1; 
   stack<int> get_min; 
};

题目三

剑指 Offer 31. 栈的压入、弹出序列


1.算法思路

该题目的意思其实是我们常见的一道栈相关的选择题,给出入栈序列,判断出栈序列是否正确。


  1. 遍历入栈序列,往栈中插入数据。

  2. 每当我们插入一个数据时,我们就判断该数据是否为出栈序列的第 i 个元素(popi=0)

  3. 如果是出栈序列的顺序中的第popi个元素,则 popi ++,表示出栈序列的第popi个出栈合理,并进行删除栈顶元素。

  4. 当数据插入结束时,如果栈为空或popi==poped.size(),表示出栈序列符合先进先出,反之,则出战序列错误。

2.总结心得

难点就在于中间的循环

中间的循环模拟的就是我们在任意时刻出栈的过程(重点)。

理解上面这句话就可以说理解了这道题目,我们回忆我们做题时的思路,每当压入一个元素后,就判断此时出栈是否符合出栈序列,如果我们用代码实现该思考过程,就是中间这个循环的这个比对过程。

3.可执行代码

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        stack<int>  st;
		int popi = 0;
        for(auto e:pushed)
        {
            st.push(e);
            while((!st.empty())&&st.top()==popped[popi])
            {
                st.pop();
                popi++;
            }
        }
        return st.empty();
    }
};

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

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

相关文章

软件测试 -- 进阶 8 软件测试流程和过程

盖天下之事&#xff0c;不难于立法&#xff0c;而难于法之必行&#xff1b;不难于听言&#xff0c;而难于言之必效。-- 明 张居正 释译&#xff1a;天下大事&#xff0c;困难的不在于要制定什么法律&#xff0c;而在于立了法就一定要执行&#xff1b;重要的不在于说什么&a…

【实时数仓】DWS层之地区主题表(FlinkSQL)、关键词主题表(FlinkSQL)

文章目录一 DWS层-地区主题表(FlinkSQL)1 分组开窗和聚合计算&#xff08;1&#xff09;分组窗口&#xff08;2&#xff09;选择分组窗口的开始和结束时间戳&#xff08;3&#xff09;系统内置函数&#xff08;4&#xff09;完整代码2 将动态表转换为流&#xff0c;写入ClickHo…

计算机基础(五):C语言的程序的处理过程

一段C语言程序 打开任何一个C语言的教程&#xff0c;首先自然是展示一段 Hello World 的程序&#xff0c;类似于下面这段&#xff1a; #include <stdio.h>int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }运行上面这段程序也很简…

Qt中的数据库(简单使用)

在Qt中支持对数据库的操作 Qt中数据库的类有&#xff1a; 驱动层&#xff1a;为具体的数据库和SQL接口层之间提供底层的桥梁SQL层&#xff1a;提供对数据库的访问 QSqlDateBase类用来创建连接QSqlQuery可以使用SQL语句实现交互用户接口层&#xff1a;实现将数据库中的数据链接…

36. 卷积神经网络(LeNet)

通过之前几节&#xff0c;我们学习了构建一个完整卷积神经网络的所需组件。 回想一下&#xff0c;之前我们将softmax回归模型和多层感知机模型应用于Fashion-MNIST数据集中的服装图片&#xff0c;为了能够应用softmax回归和多层感知机&#xff1a; 我们首先将每个大小为的图像…

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)

&#x1f37a;基于Python的Web服务器系列相关文章编写如下&#x1f37a;&#xff1a; &#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask快速入门&#xff09;&#x1f388;&#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask案例测试&#xff09;&a…

大数据-玩转数据-Kafka实战

一、kafka使用要点 要点一&#xff1a;Producer即生产者&#xff0c;向Kafka集群发送消息&#xff0c;在发送消息之前&#xff0c;会对消息进行分类&#xff0c;即Topic&#xff0c;topic1&#xff0c;topic2。Topic即主题&#xff0c;通过对消息指定主题可以将消息分类&#…

工具-能写会看正则表达式【强烈建议收藏!】

正则表达式,很常用的一个技能点,但是一般的开发流程中都是这样的: 需要验证数据上网搜一下正则表达式CV 搞定!!!今天有时间回看了一下文档,简单整理了一下里面需要注意的点,并且通过分析几个常见的正则表达式,下次遇到正则争取不再只依靠 CV 大法! 基础部分 基本语法 …

初识指针(9)

目录 1、指针是什么&#xff1f; 2、指针和指针类型 1、指针- 整数 2、指针的解引用 3、野指针 1、野指针成因 2、如何规避野指针 4、指针运算 1、指针- 整数 2、指针- 指针 3、指针的关系运算 5、指针和数组 6、二级指针 7、指针数组 1、指针是什么&#xff1f;…

04-Hystrix

服务熔断Hystrix 1. Hystrix是什么 分布式系统环境下&#xff0c;服务间类似依赖非常常见&#xff0c;一个业务调用通常依赖多个基础服务。如下图&#xff0c;对于同步调用&#xff0c;当库存服务不可用时&#xff0c;商品服务请求线程被阻塞&#xff0c;当有大批量请求调用库…

SpringBoot-2 读取properties;自动加载127个类原理总结;全部加载,按需配置

读取properties 方式一&#xff1a;非配置类填写&#xff1a;ComponentConfigurationProperties 1)建立bean&#xff1a; /只有在容器中的组件才拥有springboot提供的强大功能 Component ConfigurationProperties(prefix "mycar") public class Car {private Stri…

【机器学习】模型评估与选择

模型评估与选择 目录一、评估方法1、留出法2、交叉验证法3、自助法二、性能度量1、错误率与准确率2、查准率、查全率阈值对查准率、查全率的影响3、F1度量&#xff08;基于查准率与查全率的调和平均&#xff09;4、P-R Curve5、ROC CurvePRC和ROC的选用准则PRC和ROC的差异6、代…

python 中文转带音调的拼音

python 中文转带音调的拼音 前言python 中文转带音调的拼音1、1.1 安装pinyin模块1.2 试验1.3 效果图1.4 代码实现前言 今天整理中药材,每个药材上标上带音调的拼音,查了些,有的易形成乱码,如Shān Mi Dōnɡ,想到python自已动手转算了 python 中文转带音调的拼音 1、 …

(五)汇编语言——[bx]和loop指令

目录 [...]与&#xff08;...&#xff09; [...] &#xff08;...&#xff09; idata Loop指令 段前缀 总结 [...]与&#xff08;...&#xff09; [...] 这个我们其实见过&#xff0c;代表的是一个内存单元&#xff0c;段地址在DS中&#xff0c;偏移地址就是[bx]。 &am…

《图解TCP/IP》阅读笔记(第七章 7.4)—— RIP 路由信息协议

7.4 RIP RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;&#xff0c;是一种距离向量算法&#xff0c;广泛用于LAN。 该协议将路由控制信息定期&#xff08;30秒一次&#xff09;向全网广播。如果没有收到路由控制信息&#xff0c;连接就会…

【1739. 放置盒子】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 有一个立方体房间&#xff0c;其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子&#xff0c;每个盒子都是一个单位边长的立方体。放置规则如下&#xff1a; 你可以把盒子放在地板上的…

筛法(线性筛,厄拉多塞筛)

在前前前前前前…的博客中,我们主要谈了欧拉筛和埃氏筛. 今天我们主要来聊一聊线性筛和厄拉多塞筛(其实和埃氏筛和欧拉筛本质上没区别哎).其实在这两种筛法中厄拉多塞筛最好懂(就连本蒟蒻一看代码就明白了…别看这个名字,容易糊弄人) 首先是厄拉多塞筛"粉墨登场"::…

HRTransNet阅读理解

E. Dual-direction short connection fusion module HRFormer applies transformer blocks to enlarge receptive field of fused feature Frs, and uses exchange units to absorb the merits of multi-scales features. The process is described as: HRFormer使用TRM块来扩…

《教育的目的》笔记——如何让学生通过树木看见森林

目录 作者简介 个人感悟 经典摘录 1、学生所受的训练应该比他们最终投身的专业更为广泛 2、学习新语言用途 3、教师的责任 4、教育的主题 5、学到的有用之物 6、教育目的 7、所有事物都不是静态的、定型的&#xff0c;而是处于形成&#xff08;becoming&#xff09;过…

Merry Xmas | 用Matplotlib画个3D圣诞树送给你!~

1写在前面 Merry Christmas ! &#x1f973; 过完圣诞就要跨年了&#xff0c;希望2023年自己可以一扫霉运&#xff0c;顺顺利利&#xff01;&#xff01;&#xff01;&#x1f618; 从网上抄了个英文的祝福语送给大家&#xff08;主要是懒&#xff09;: &#x1f447; I hope S…