-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCalculator.java
67 lines (60 loc) · 1.5 KB
/
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package calculator;
import java.util.*;
public class Calculator {
public int cal(String s) {
char[] cs = s.toCharArray();
Stack<Integer> stack = new Stack<>();
int i = 0;
int prev1 = 0, op1 = 1, prev2 = 1, op2 = 1;
while(i < cs.length) {
// new num
if(Character.isDigit(cs[i])) {
int num = 0;
while(i < cs.length && Character.isDigit(cs[i])) {
num = 10*num + cs[i++]-'0';
}
i--; // avoid skipping
if(op2 == 1) prev2 *= num;
else if(op2 == 2) prev2 /= num;
else prev2 = (int)(Math.pow(prev2, num));
}
// lvl 1 operator
else if(cs[i] == '+' || cs[i] == '-') {
prev1 += op1*prev2;
op1 = cs[i]=='+'? 1: -1;
op2 = 1;
prev2 = 1;
}
// lvl 2 operator
else if(cs[i] == '*' || cs[i] == '/' || cs[i] == '^') {
if(cs[i] == '*') op2 = 1;
else if(cs[i] == '/') op2 = 2;
else op2 = 3;
}
// left parenthesis, cache and reset
else if(cs[i] == '(') {
stack.push(prev1);
stack.push(prev2);
stack.push(op1);
stack.push(op2);
prev1 = 0;
prev2 = 1;
op1 = 1;
op2 = 1;
}
// right parenthesis, merge
else if(cs[i] == ')') {
int num = prev1 + op1*prev2;
op2 = stack.pop();
op1 = stack.pop();
prev2 = stack.pop();
prev1 = stack.pop();
if(op2 == 1) prev2 *= num;
else if(op2 == 2) prev2 /= num;
else prev2 = (int)(Math.pow(prev2, num));
}
i++;
}
return prev1 + op1*prev2;
}
}