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.
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
没有了括号,只需要考虑乘除的高优先级问题,discuss中有一个比较清楚的方法:建立一个栈,当运算符为乘除时,将栈顶元素乘除当前数,当运算符为加减时,直接将该数压入栈顶,最后将栈内的数累加即为所求:
public int calculate(String s) { int i=0; Stack<Integer> stack=new Stack<>(); char sign='+'; while(i<s.length()){ while(i<s.length()&&s.charAt(i)==' '){ i++; } if(i==s.length()) break; if(s.charAt(i)=='+'||s.charAt(i)=='-'||s.charAt(i)=='*'||s.charAt(i)=='/') { sign=s.charAt(i); i++; } else{ int k=0; while(i<s.length()&&s.charAt(i)>='0'&&s.charAt(i)<='9'){ k=k*10+(s.charAt(i)-'0'); i++; } if(sign=='+') stack.push(k); else if(sign=='-') stack.push(-k); else if(sign=='*') stack.push(stack.pop()*k); else if(sign=='/') stack.push(stack.pop()/k); } } int res=0; for(int num:stack){ res+=num; } return res; }