0
点赞
收藏
分享

微信扫一扫

LeetCode-150- 逆波兰表达式求值

逆波兰表达式求值

解法一:栈
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class LeetCode_150 {

    public static int evalRPN(String[] tokens) {
        if (tokens.length == 1) {
            return Integer.valueOf(tokens[0]);
        }
        List<String> operatorList = new ArrayList<>();
        operatorList.add("+");
        operatorList.add("-");
        operatorList.add("*");
        operatorList.add("/");

        // 操作数栈
        Stack<Integer> nums = new Stack<>();

        for (int i = 0; i < tokens.length; i++) {
            if (operatorList.contains(tokens[i])) {
                // 如果是操作符,取出2个操作数进行运算然后将结果重新入栈
                int num1 = Integer.valueOf(nums.pop());
                int num2 = Integer.valueOf(nums.pop());
                if ("+".equals(tokens[i])) {
                    nums.push(num2 + num1);
                } else if ("-".equals(tokens[i])) {
                    nums.push(num2 - num1);
                } else if ("*".equals(tokens[i])) {
                    nums.push(num2 * num1);
                } else if ("/".equals(tokens[i])) {
                    nums.push(num2 / num1);
                }
            } else {
                // 如果是操作数,则入栈
                nums.push(Integer.valueOf(tokens[i]));
            }
        }
        return nums.pop();
    }

    public static void main(String[] args) {
        // 测试用例
        String[] tokens = new String[]{"10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"};
        // 转换成中缀表达式的结果是: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
        // 计算结果为: 22
        System.out.println(evalRPN(tokens));
    }
}
举报

相关推荐

0 条评论