LeetCode—evaluate-reverse-polish-notation(计算逆波兰表达式)-Java

题目描述

Evaluate the value of an arithmetic expression in Reverse Polish Notation.

Valid operators are+,-,*,/. Each operand may be an integer or another expression.

Some examples:

  ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
  ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

解释:

逆波兰表达式,也叫后缀表达式。

下面以(a+b)*c为例子进行说明: 

  • (a+b)*c的逆波兰式为ab+c*,假设计算机把ab+c*按从左到右的顺序压入栈中,并且按照遇到运算符就把栈顶两个元素出栈,执行运算,得到的结果再入栈的原则来进行处理,那么ab+c*的执行结果如下:
  1. a入栈(0位置);
  2. b入栈(1位置);
  3. 遇到运算符“+”,将ab出栈,执行a+b的操作,得到结果d=a+b,再将d入栈(0位置);
  4. c入栈(1位置);
  5. 遇到运算符“*”,将dc出栈,执行d*c的操作,得到结果e,再将e入栈(0位置)。

经过以上运算,计算机就可以得到(a+b)*c的运算结果e了。

思路解析

使用栈来解决这个问题,分两种情况:

  • 数字的话直接push进去
  • 符号的话就要看是什么符号,

进行计算,计算完毕再push到栈中。

代码

import java.util.Stack;
public class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> s = new Stack<Integer>();
        for(int i=0;i<tokens.length;i++){
            switch(tokens[i]){
                case "+":
                    s.push(s.pop()+s.pop());
                    break;
                case "-":
                    int a1=s.pop();
                    int a2=s.pop();
                    s.push(a2-a1);
                    break;
                case "*":
                    s.push(s.pop()*s.pop());
                    break;
                case "/":
                    int b1=s.pop();
                    int b2=s.pop();
                    s.push(b2/b1);
                    break;
                default:
                    s.push(Integer.parseInt(tokens[i]));
                    break;
            }
        }
        return s.pop();
    }
}
LeetCode

猜你喜欢

转载自blog.csdn.net/lynn_baby/article/details/80365566
今日推荐