计算逆波兰式(后缀表达式)的值

2021-12-22 15:09:01 浏览数 (1)

题目描述

计算逆波兰式(后缀表达式)的值 运算符仅包含" ","-",""和"/",被操作数可能是整数或其他表达式 例如: ["2", "1", " ", "3", ""] -> ((2 1) * 3) -> 9↵ ["4", "13", "5", "/", " "] -> (4 (13 / 5)) -> 6

思路:

做出这题只要了解啥叫后缀表达式就行, 所以后缀表达式,其实通俗讲就是我们碰到运算字符时候要从后往前取两个数计算出运算结果并返回去 很明显是用栈了

另外注意一个顺序问题,比如我们存顺序是0 3 /,我们想求0/3,

但是要 注意先取出来是3,运算时候注意是后取出来的操作先取出来的

code

代码语言:javascript复制
public int evalRPN(String[] tokens) {
        if (tokens.length==1){
            return Integer.parseInt(tokens[0]);
        }
        String str=" -*/";
        Stack<Integer> stack=new Stack<>();
        for(int i=0;i<=tokens.length-1;i  ){
            if (!str.contains(tokens[i])){//非运算符
                stack.push(Integer.parseInt(tokens[i]));
            }else {
                int n1=stack.pop();
                int n2=stack.pop();
                if (tokens[i].equals(" ")){
                    stack.push(n1 n2);
                }else if (tokens[i].equals("-")){
                    stack.push(n2-n1);
                }else if (tokens[i].equals("*")){
                    stack.push(n2*n1);
                }else if (tokens[i].equals("/")){
                    stack.push(n2/n1);
                }
            }
        }
        return stack.pop();
    }
这里引入一个我看到很有意思的解法 哈哈哈
代码语言:javascript复制
链接:https://www.nowcoder.com/questionTerminal/22f9d7dd89374b6c8289e44237c70447?f=discussion
来源:牛客网

import java.util.Stack;
public class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<Integer>();
        for(int i = 0;i<tokens.length;i  ){
            try{
                int num = Integer.parseInt(tokens[i]);
                stack.add(num);
            }catch (Exception e) {
                int b = stack.pop();
                int a = stack.pop();
                stack.add(get(a, b, tokens[i]));
            }
        }
        return stack.pop();
    }
    private int get(int a,int b,String operator){
        switch (operator) {
        case " ":
            return a b;
        case "-":
            return a-b;
        case "*":
            return a*b;
        case "/":
            return a/b;
        default:
            return 0;
        }
    }
}

虽然不难,但是呢 我觉得很有意思,竟然利用抛异常去处理 哈哈哈哈

0 人点赞