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
定义一个temp 的stack来保存运算的操作数(包括中间的运算值)
d 来保存上一个操作数
op 来保存上一个操作数,不是当前的操作数
遍历字符串
如果是数字,入 stack
如果是操作符
+: 将 +d 存入stack
-: 将 -d 存入 stack
* : 将 stack 的top值与 d 的乘积存入 stack
/: 将 stack 的top 值与 d 的除值 存入 stack
空间复杂度是 O(N), 时间复杂度是 O(N)。需要注意的是:每次操作数入栈的时间是下一个操作符的时候,有点类似与延迟运算,所以需要把最近的操作数和操作符存入两个额外的变量。还有一个小技巧,如果我们给字符串的前面和后面分别增加一个'+'操作符,可以减少代码的复杂度。如 "1+2*3" 修改成 "+1+2*3+ "。