Description
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.
Solution
给一串string表示的算式,其中可能有空格,计算它的结果。
We use a stack to help us calculate multiple and divide. For every character in s, If it is a number, then we have to rebuild this number. num = num * 10 + c - ‘0’. If it is not a number and not a space, or it is the last character, which means we have to end the calculation.
We use plus as initial sign. When processed to a non-digit character, if it is + or -, we simply push it to stack. If it is * or /, we have to calculate with last number, which stores on the top of the stack. After that, we assign new sign with character and num = 0.
The sum of the numbers in stack is the final answer.
Code
class Solution {
public int calculate(String s) {
if (s.length() == 0)
return 0;
Stack<Integer> stack = new Stack<>();
int num = 0;
char sign = '+';
for (int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if (Character.isDigit(c)){
num = num * 10 + c - '0';
}
if ((!Character.isDigit(c) && c != ' ') || i == s.length() - 1){
if (sign == '+'){
stack.push(num);
}
else if (sign == '-'){
stack.push(-num);
}
else if (sign == '*'){
stack.push(stack.pop() * num);
}
else if (sign == '/'){
stack.push(stack.pop() / num);
}
sign = c;
num = 0;
}
}
int result = 0;
for (int i : stack){
result += i;
}
return result;
}
}
Time Complexity: O(n)
Space Complexity: O(n)