forked from wisdompeak/LeetCode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbasic_calculator.java
43 lines (38 loc) · 1.29 KB
/
basic_calculator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Solution {
public int calculate(String s) {
StringBuilder sb = new StringBuilder();
sb.append("+");
for(char c: s.toCharArray()){
if(c == ' ') continue;
sb.append(c);
if(c == '('){
sb.append("+");
}
}
Deque<Integer> nums = new ArrayDeque<>();
Deque<Integer> signs = new ArrayDeque<>();
int sum = 0;
int sign = 0;
for(int i = 0; i < sb.length(); i++){
if(sb.charAt(i) == '+' || sb.charAt(i) == '-' ){
sign = sb.charAt(i) == '+' ? 1 : -1;
}else if(Character.isDigit(sb.charAt(i))){
int cur = 0;
int j = i;
while(j < sb.length() && Character.isDigit(sb.charAt(j))){
cur = cur * 10 + (sb.charAt(j) - '0');
j+=1;
}
i = j-1;
sum += cur * sign;
}else if(sb.charAt(i) == '('){
nums.addFirst(sum);
signs.addFirst(sign);
sum = 0;
}else if(sb.charAt(i) == ')'){
sum = nums.pollFirst() + signs.pollFirst() * sum;
}
}
return sum;
}
}