Implement a basic calculator to evaluate a simple expression string.
The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.
You may assume that the given expression is always valid.
Some examples:
"3+2*2" = 7
" 3/2 " = 1
" 3+5 / 2 " = 5

Note: Do not use the eval built-in library function.

题意:求值

public class Solution {
    public int calculate(String s) {
        int digt=0;
        char op='+';
        int res=0;
        int n=s.length();
        Stack<Integer> stack=new Stack<>();
        for(int i=0;i<n;i++){
            if(s.charAt(i)>='0' && s.charAt(i)<='9')
                digt=digt*10+s.charAt(i)-'0';
                int temp=digt;
            if(s.charAt(i)=='+' || s.charAt(i)=='-' || s.charAt(i)=='*' || s.charAt(i)=='/' || i==n-1){
                switch(op){
                    case '+':stack.push(digt);break;
                    case '-':stack.push(-digt);break;
                    case '*':stack.push(stack.pop()*digt);break;
                    case '/':stack.push(stack.pop()/digt);break;
                }     
                op=s.charAt(i);
                digt=0;
            }
        }
        while(!stack.empty()){
            res+=stack.pop();
        }
        return res;
    }
}

PS:

Stack

  1. 定义一个temp 的stack来保存运算的操作数(包括中间的运算值)

  2. d 来保存上一个操作数

  3. op 来保存上一个操作数,不是当前的操作数

  4. 遍历字符串

    1. 如果是数字,入 stack

    2. 如果是操作符

      1. +: 将 +d 存入stack

      2. -: 将 -d 存入 stack 

      3. * : 将 stack 的top值与 d 的乘积存入 stack

      4. /: 将 stack 的top 值与 d 的除值 存入 stack


空间复杂度是 O(N), 时间复杂度是 O(N)。需要注意的是:每次操作数入栈的时间是下一个操作符的时候,有点类似与延迟运算,所以需要把最近的操作数和操作符存入两个额外的变量。还有一个小技巧,如果我们给字符串的前面和后面分别增加一个'+'操作符,可以减少代码的复杂度。如 "1+2*3" 修改成 "+1+2*3+ "。