剑指 Offer II 036. 后缀表达式(栈)


题目

根据 逆波兰表示法,求该后缀表达式的计算结果。

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

说明:

  • 整数除法只保留整数部分。
  • 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 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] 内的整数

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/8Zf90G


一、栈

解题思路:
定义一个栈,存储操作数,从左至右遍历后缀表达式数组:

  1. 当遇到操作数,则压入栈
  2. 当遇到操作符,弹出前两个操作数,并进行运算,把运算结果压入栈

运行至最后,栈中会只存在一个数,即是结果

代码如下:

class Solution {
	public int evalRPN(String[] tokens) {
        Deque<Integer> eq = new LinkedList<>();
        int n = tokens.length;
        for(int i=0;i<n;i++){
            String token = tokens[i];
            if(isNumber(token)) eq.push(Integer.parseInt(token));
            else{
                int b = eq.pop();
                int a = eq.pop();
                switch(token){
                    case "+":
                        eq.push(a+b);
                        break;
                    case "-":
                        eq.push(a-b);
                        break;
                    case "*":
                        eq.push(a*b);
                        break;
                    case "/":
                        eq.push(a/b);
                        break;
                }
            }
        }
        return eq.pop();
    }
	//判断是否为操作数
    public boolean isNumber(String s){
        return !("+".equals(s)||"-".equals(s)||"*".equals(s)||"/".equals(s));
    }
}

二、数组模拟栈

根据栈方法的思想,
定义一个数组stack存储操作数
而对于数组则需要预定义数组大小,对于一个有效的后缀表达式,其长度大小必定为奇数,且操作数比操作符的个数多一个,所以最坏情况下stack数组内元素最多时可为(n+1)/2.

定义index下标始终指向stack数组中最后一位有效数

运算到最后stack数组只有一个数,输出stack[0]
代码如下:

class Solution {
//数组模拟栈
    public int evalRPN(String[] tokens) {
        int n = tokens.length;
        int[] stack = new int[(n+1)/2];
        int index = -1;
        for(int i=0;i<n;i++){
            String token = tokens[i];
            switch(token){
                case "+":
                    stack[--index]=stack[index]+stack[index+1];
                    break;
                case "-":
                    stack[--index]=stack[index]-stack[index+1];
                    break;
                case "*":
                    stack[--index]=stack[index]*stack[index+1];
                    break;
                case "/":
                    stack[--index]=stack[index]/stack[index+1];
                    break;
                default:
                    stack[++index]=Integer.parseInt(token);
            }
        }
        return stack[0];
    }
 }

加深栈方法使用:
剑指 Offer II 037. 小行星碰撞(栈)
剑指 Offer II 038. 每日温度(单调栈)


参考力扣解析:
https://leetcode-cn.com/problems/8Zf90G/solution/hou-zhui-biao-da-shi-by-leetcode-solutio-39j5/

侵删

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值