public class T {
public static void main(String[] args) {
long calculate = calculate("12+2312*(623+23*61*(6))");
System.out.println(calculate);
}
public static long calculate(String express) {
Queue<Integer> queue = new LinkedList<>();
Stack<Integer> numStack = new Stack<>();
Stack<Character> operateStack = new Stack<>();
operateStack.push('#');
int num1, num2;
char[] chars = express.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (isDigits(chars[i])) {
queue.offer(chars[i] - '0');
int j = i + 1;
for (; isDigits(chars[j]); j++) {
queue.offer(chars[j] - '0');
}
i = j - 1;
numStack.push(toNumber(queue));
} else if (isOperate(chars[i])) {
if (comparePriority(operateStack.peek(), chars[i])) {
i--;
Character operate = operateStack.pop();
if (numStack.size() < 2) {
throw new IllegalArgumentException();
}
num1 = numStack.pop();
num2 = numStack.pop();
numStack.push(calculate(num1, num2, operate));
} else {
operateStack.push(chars[i]);
}
} else if (chars[i] == '(') {
operateStack.push(chars[i]);
} else if (chars[i] == ')') {
Character operate = operateStack.pop();
while (operate != '(') {
num1 = numStack.pop();
num2 = numStack.pop();
numStack.push(calculate(num1, num2, operate));
operate = operateStack.pop();
}
} else {
throw new IllegalArgumentException();
}
}
Character operate = operateStack.pop();
while (operate != '#') {
num1 = numStack.pop();
num2 = numStack.pop();
numStack.push(calculate(num1, num2, operate));
operate = operateStack.pop();
}
return numStack.pop();
}
private static int calculate(int a, int b, char operate) {
switch (operate) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
throw new IllegalArgumentException();
}
}
private static boolean isDigits(char c) {
return c >= '0' && c <= '9';
}
private static boolean isOperate(char c) {
return c == '+' || c == '-' || c == '/' || c == '*' || c == '#';
}
private static boolean comparePriority(char one, char two) {
if ((one == '*' || one == '/')
&& (two == '+' || two == '-')) {
return true;
}
return (one == '+' || one == '-') && two == '#';
}
private static int toNumber(Queue<Integer> queue) {
int res = 0;
for (; !queue.isEmpty(); ) {
res = res * 10 + queue.poll();
}
return res;
}
}