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.
Example 1:
Input: "3+2*2" Output: 7
Example 2:
Input: " 3/2 " Output: 1
Example 3:
Input: " 3+5 / 2 " Output: 5
Note:
- You may assume that the given expression is always valid.
- Do not use the
eval
built-in library function.
思路:这道题厉害的样例是“100000/8/7/6”,导致算式必须从左向右算。另外,要切分数字。
所以,第一次遍历时只求出每一段的和,第二次则把部分和累加。
class Solution {
public int calculate(String s) {
Stack<Integer> stack = new Stack<Integer>();
char symbol = '+';
char[] nums = s.toCharArray();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nums.length; i++) {
if (nums[i] <= '9' && nums[i] >= '0') {
sb.append(nums[i]);
if (i == nums.length - 1) {
int num2 = Integer.valueOf(sb.toString());
if (symbol == '+') {
stack.push(num2);
} else if (symbol == '-') {
stack.push(-num2);
} else if (symbol == '*') {
int num1 = stack.pop();
stack.push(num1 * num2);
} else {
int num1 = stack.pop();
stack.push(num1 / num2);
}
}
} else if (nums[i] == ' ') {
if (i == nums.length - 1) {
int num2 = Integer.valueOf(sb.toString());
if (symbol == '+') {
stack.push(num2);
} else if (symbol == '-') {
stack.push(-num2);
} else if (symbol == '*') {
int num1 = stack.pop();
stack.push(num1 * num2);
} else {
int num1 = stack.pop();
stack.push(num1 / num2);
}
}
continue;
} else {
int num2 = Integer.valueOf(sb.toString());
sb = new StringBuilder();
if (symbol == '+') {
stack.push(num2);
} else if (symbol == '-') {
stack.push(-num2);
} else if (symbol == '*') {
int num1 = stack.pop();
stack.push(num1 * num2);
} else {
int num1 = stack.pop();
stack.push(num1 / num2);
}
symbol = nums[i];
}
}
int ans = 0;
for(int num : stack){
ans += num;
}
return ans;
}
}