首页 > 其他分享 >【LeetCode队列#04】逆波兰表达式求值(仍然是经典的栈操作)

【LeetCode队列#04】逆波兰表达式求值(仍然是经典的栈操作)

时间:2023-02-15 15:22:29浏览次数:54  
标签:运算符 num1 04 long st tokens 求值 LeetCode 表达式

逆波兰表达式求值

力扣题目链接(opens new window)

根据 逆波兰表示法,求表达式的值。

有效的运算符包括 + , - , * , / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

说明:

整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

示例 1:

  • 输入: ["2", "1", "+", "3", " * "]
  • 输出: 9
  • 解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

示例 2:

  • 输入: ["4", "13", "5", "/", "+"]
  • 输出: 6
  • 解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

示例 3:

  • 输入: ["10", "6", "9", "3", "+", "-11", " * ", "/", " * ", "17", "+", "5", "+"]

  • 输出: 22

  • 解释:该算式转化为常见的中缀算术表达式为:

    ((10 * (6 / ((9 + 3) * -11))) + 17) + 5       
    = ((10 * (6 / (12 * -11))) + 17) + 5       
    = ((10 * (6 / -132)) + 17) + 5     
    = ((10 * 0) + 17) + 5     
    = (0 + 17) + 5    
    = 17 + 5    
    = 22    
    

逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。

平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。

该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。

逆波兰表达式主要有以下两个优点:

  • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
  • 适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。

思路

什么是逆波兰表达式

题目注释里面也提到了,逆波兰表达式是一种后缀表达式

那么什么™的又是后缀表达式呢?这就要从平时我们习惯使用的表达式说起

例如:(1+2)*(3+4)

这种我们平时使用的表达式叫做:中序表达式,在顺序上是比较符合人类阅读的

但计算机读起来就得转换,而计算机可以直接读的就是后缀表达式

上面的中序表达式用二叉树来写就可以写成:

     *
    / \
   +   +
  / \ / \
 1  2 3  4

然后按照二叉树后续遍历(左右中,之后会学到)的顺序遍历上述二叉树得到:12+34+*

这个就是由来

用栈解决问题

与有效括号和删除字符串相邻字符类似,我们也是用栈进行一种类似"消消乐"的操作

代码

步骤

1、遍历字符串

  • 如果遇见运算符,从栈里取2个元素(取一个pop一个,一共取两次)
  • 判断遇到的运算符,做相应计算后push回栈中
  • 如果遇见数字,就把数字转成int类型然后存回栈里

2、遍历结束,返回栈中仅剩的一个元素

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> st;
        //遍历字符串
        for(int i = 0; i < tokens.size(); ++i){
            if(tokens[i] == "+"|| tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/"){//遇到运算符
                //取两个数
                long long num1 = st.top();
                st.pop();
                long long num2 = st.top();
                st.pop();
                //判断运算符,做相应计算并压栈//注意计算顺序,num2[运算符]num1
                if(tokens[i] == "+") st.push(num2 + num1);
                if(tokens[i] == "-") st.push(num2 - num1);
                if(tokens[i] == "*") st.push(num2 * num1);
                if(tokens[i] == "/") st.push(num2 / num1);
            }else{//遇到数字
                //转为整型,压栈
                st.push(stoll(tokens[i]));
            }
        }
        int res = st.top();
        st.pop();//内存回收
        return res;
    }
};

1、初始化栈的时候应该选择long long类型,其中的数也要是long long类型

2、取出num1、num2之后,计算时的顺序要正确,应该是num2[运算符]num1

3、补充知识:c++中用于将字符串类型转换为长整型的函数是

stol()(long int)和stoll()(long long int)

标签:运算符,num1,04,long,st,tokens,求值,LeetCode,表达式
From: https://www.cnblogs.com/DAYceng/p/17123183.html

相关文章

  • leetcode-数据结构与算法
    第0001题:求两数之和leetcode对应题号:1力扣-原题链接:[请点击此处](https://leetcode.cn/problems/two-sum/"请点击此处")方法一思路暴力破解法,时间复杂度是\(O(n......
  • OpenHarmony编译固件新增支持Ubuntu22.04平台
    现在OpenHarmonymaster最新分支可以在Ubuntu22.04上编译了,之前只支持在Ubuntu20.04和18.04上编译。最近发布的Beta5以及之前的版本还不支持,需要修改源码解除ubuntu22.04......
  • leetcode:题目1-
    第1题,对应leetcode题目编号:一、题目:xxx1、原题-力扣链接:请点击此处二、思路+代码1、方法一:一、思路二、代码statussList_merge3(mySList*pa,mySList*pb){ if......
  • leetcode - 1250 检查好数组
    检查好数组题目给你一个正整数数组nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个任意整数,并求出他们的和。假如该和结果为1,那么原数组就是一个「好数组」......
  • 【LeetCode队列#03】删除字符串中所有的相邻重复项
    删除字符串中所有的相邻重复项力扣题目链接(opensnewwindow)给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在S上反复执行重......
  • Ubuntu20.04开启VNC远程服务设置教程
    对于使用过PVE的大佬来说,在自己电脑安装虚拟机打开的画面惨不忍睹,其实它只是用错了地方。 今天给大家介绍一款控制工具,它叫VNC,是用来进行远程连接的非常好用的工具可......
  • leetcode - 1124 表现良好的最长时间段
    1124.表现良好的最长时间段题目给你一份工作时间表hours,上面记录着某一位员工每天的工作小时数。我们认为当员工一天中的工作小时数大于8小时的时候,那么这一天就是......
  • 【LeetCode队列#02】有效括号
    有效括号力扣题目链接(opensnewwindow)给定一个只包括'(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左......
  • [LeetCode] 2477. Minimum Fuel Cost to Report to the Capital
    Thereisatree(i.e.,aconnected,undirectedgraphwithnocycles)structurecountrynetworkconsistingof n citiesnumberedfrom 0 to n-1 andexactl......
  • [LeetCode] 1138. Alphabet Board Path
    Onanalphabetboard,westartatposition (0,0),correspondingtocharacter board[0][0].Here, board=["abcde","fghij","klmno","pqrst","uvwxy","z"],......