/**
* Runtime: 6 ms, faster than 92.97%
* Memory Usage: 41.8 MB, less than 14.25%
*/
class Solution {
public int calculate(String s) {
char[] sArr = s.toCharArray();
int res = 0, sign = 1;
Deque<Integer> stack = new LinkedList();
for (int i = 0; i < sArr.length; i++) {
switch (sArr[i]) {
case ' ' :
break;
case '+' :
sign = 1;
break;
case '-' :
sign = -1;
break;
case '*' :
int num = 0;
while (i + 1 < sArr.length && sArr[i + 1] == ' ') {
i++;
}
while (i + 1 < sArr.length && Character.isDigit(sArr[i + 1])) {
num = 10 * num + sArr[++i] - '0';
}
stack.push(stack.pop() * num);
break;
case '/' :
int num2 = 0;
while (i + 1 < sArr.length && sArr[i + 1] == ' ') {
i++;
}
while (i + 1 < sArr.length && Character.isDigit(sArr[i + 1])) {
num2 = 10 * num2 + sArr[++i] - '0';
}
stack.push(stack.pop() / num2);
break;
default :
int num3 = sArr[i] - '0';
while (i + 1 < sArr.length && Character.isDigit(sArr[i + 1])) {
num3 = 10 * num3 + sArr[++i] - '0';
}
stack.push(num3 * sign);
}
}
while (!stack.isEmpty()) {
res += stack.pop();
}
return res;
}
}