Basic Calculator II
Last updated
Last updated
class Solution {
public int calculate(String s) {
int[] numbers = Arrays.stream(s.split("[+\\-*/]")).mapToInt((a)->{return Integer.parseInt(a.trim());}).toArray();
String[] signs = Arrays.stream(s.split("[\\d]"))
.filter((a)->{return ! a.matches("\\s*");})
.map(a->a.trim())
.toArray(String[]::new);
Deque<Integer> deque = new ArrayDeque<>();
int numIndex = 0, signIndex = 0;
deque.offerLast(numbers[numIndex++]);
while (true) {
if (numIndex == numbers.length) break;
if (signs[signIndex].equals("+")) {
deque.offerLast(numbers[numIndex]);
} else if (signs[signIndex].equals("-")) {
deque.offerLast(-numbers[numIndex]);
} else if (signs[signIndex].equals("*")) {
deque.offerLast(deque.pollLast() * numbers[numIndex]);
} else {
deque.offerLast(deque.pollLast() / numbers[numIndex]);
}
numIndex++;
signIndex++;
}
int ret = 0;
while (! deque.isEmpty()) {
ret += deque.pollFirst();
}
return ret;
}
}class Solution {
public int calculate(String s) {
int num = 0;
char sign = '+';
Deque<Integer> stack = new ArrayDeque<>();
for (int i = 0; i < s.length() + 1; ++i) {
char c = i == s.length() ? '+' : s.charAt(i);
if (c >= '0' && c <= '9') {
num = num * 10 + c - '0';
continue;
} else if (c == ' ') {
continue;
} else {
if (sign == '+') {
stack.offerLast(num);
} else if (sign == '-') {
stack.offerLast(-num);
} else if (sign == '*') {
stack.offerLast(stack.pollLast() * num);
} else {
stack.offerLast(stack.pollLast() / num);
}
sign = c;
num = 0;
}
}
int ret = 0;
while (! stack.isEmpty()) ret += stack.pollLast();
return ret;
}
}