leetcode 150-逆波兰表达式求值

转载自leetcode
逆波兰表达式:

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

平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
逆波兰表达式主要有以下两个优点:

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

在这里插入图片描述

题解

题解1
解题思路

如果遇到操作数,则将操作数入栈;
如果遇到运算符,则将两个操作数出栈,其中先出栈的是右操作数,后出栈的是左操作数,使用运算符对两个操作数进行运算,将运算得到的新操作数入栈。
atoi():把字符串转换为整形数
isNumber():如果是单个字符,判断是否在’0’与’9’之间;如果长度大于1,不用继续判断
在这里插入图片描述
代码的解题思路可参考代码随想录

//计算规则是遇到一个运算符就计算前面的所有部分和前一个数字
//逆波兰表达式相当于二叉树的后序遍历,可以把运算符作为中间节点,按照后序遍历的规则画出一个二叉树
//在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么这岂不就是一个相邻字符串消除的过程,和1047.删除字符串中的所有相邻重复项中的对对碰游戏是不是就非常像了。

/*
使用栈
//1.什么时候出栈出栈?
遍历数组入栈,遇到运算符的时候将前两个数字出栈,将数字计算后将计算结果入栈
2.什么时候终止?栈为空的时候
*/
class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        String c;
        int temp;
        for(int i=0;i<tokens.length;i++){
            c=tokens[i];
            //Leetcode不能使用==判断字符串String是否相等
            //注意字符char是'',字符串String是""
            if (c.equals("+")) stack.push(stack.pop()+stack.pop());
            //注意-和/需要考虑顺序,需要特殊处理,后pop的➗先pop的
            else if (c.equals("-")){
                temp = stack.pop();
                stack.push(stack.pop()-temp);
            }
            else if (c.equals("*")) stack.push(stack.pop()*stack.pop());
            else if (c.equals("/")){
                temp = stack.pop();
                stack.push(stack.pop()/temp);
                }
            //注意将string转为Integer才能放入stack
            else stack.push(Integer.valueOf(c));
        }
        return stack.pop();
    }
}

复杂度分析
时间复杂度:O(n),其中 n 是数组 tokens 的长度。需要遍历数组 tokens 一次,计算逆波兰表达式的值
空间复杂度:O(n),其中 n 是数组 tokens 的长度。使用栈存储计算过程中的数,栈内元素个数不会超过逆波兰表达式的长度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值