「leetCode」150-逆波兰表达式求值⚡️

119 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

大家好,我是速冻鱼🐟,一条水系前端💦,喜欢花里胡哨💐,持续沙雕🌲,是隔壁寒草🌿的好兄弟,刚开始写文章。 如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~

题目🦀

150. 逆波兰表达式求值

难度中等

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

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

注意 两个整数之间的除法只保留整数部分。

可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

示例 1:

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

示例 2:

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

示例 3:

输入:tokens = ["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 <= tokens.length <= 104

  • tokens[i] 是一个算符("+""-""*""/"),或是在范围 [-200, 200] 内的一个整数

逆波兰表达式:

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

  • 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )
  • 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )

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

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

解题思路🌵

  • 遍历token流
  • 使用栈来保存遇到的数值和计算后的数值
  • 最后返回栈顶元素即可
  • 重要的是理解逆波兰表达式的意思

解题步骤🌟

  • 初始化stack
  • 遍历tokens
  • 遇到+-*/分别从栈弹出2个数字进行计算,然后再将结果入栈
  • 如果遇到数字直接入栈
  • 最后返回栈顶元素

源码🔥

/**
 * @param {string[]} tokens
 * @return {number}
 */
var evalRPN = function(tokens) {
    const stack = []
    const calculate = (operator)=>{
        const num2 =Number(stack.pop())
        const num1 =Number(stack.pop())
        switch (operator){
            case '+' : 
            stack.push(num1+num2);break;
            case '-' :
            stack.push(num1-num2);break;
            case '*' :
            stack.push(num1*num2);break;
            case '/' :
            stack.push((num1/num2)>>0);break;
        }
    }
    for(let i =0;i<tokens.length;i++){
        switch(tokens[i]){
            case '+' : calculate('+'); break;
            case '-' : calculate('-'); break;
            case '*' : calculate('*'); break;
            case '/' : calculate('/'); break;
            default  : stack.push(tokens[i]);
        }
    }
    return stack[0]
};

时间复杂度:O(N)

空间复杂度:O(N)

结束语🌞

那么鱼鱼的LeetCode算法篇的「leetCode」150-逆波兰表达式求值⚡️就结束了,虽然前端对算法要求没有后端高,但是算法是编程基础,程序=数据结构➕算法,所以算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾,欢迎加我好友,一起沙雕,一起进步

github🤖:sudongyu

个人博客👨‍💻:速冻鱼blog

vx👦:sudongyuer

写在最后

伙伴们,如果喜欢我的口水话给🐟🐟点一个赞👍或者关注➕都是对我最大的支持。