import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
public int solve(String s) {
// write code here
Stack<Integer> nums = new Stack<>();
Stack<Character> ops = new Stack<>();
Map<Character, Integer> map = new HashMap<>();
map.put('+', 1);
map.put('-', 1);
map.put('*', 2);
s = s.replaceAll(" ", "");
char[] array = s.toCharArray();
nums.push(0);
for (int i = 0; i < array.length; i++) {
if (array[i] == '(') {
ops.push(array[i]);
} else if (array[i] == ')') {
while (!ops.isEmpty() && ops.peek() != '(') {
Calculate(nums, ops);
}
ops.pop();
} else if (Character.isDigit(array[i])) {
int n = 0;
while (i < array.length && Character.isDigit(array[i])) {
n = n * 10 + array[i++] - '0';
}
nums.push(n);
i--;
} else {
if (!ops.isEmpty() && map.containsKey(ops.peek()) &&
map.get(ops.peek()) >= map.get(array[i])) {
Calculate(nums, ops);
}
ops.push(array[i]);
}
}
while (!ops.isEmpty()) {
Calculate(nums, ops);
}
return nums.pop();
}
public void Calculate(Stack<Integer> nums, Stack<Character> ops) {
if (nums.size() < 2 || ops.isEmpty()) {
return;
} else {
int n2 = nums.pop(), n1 = nums.pop(), ans = 0;
char op = ops.pop();
switch (op) {
case '+':
ans = n1 + n2;
break;
case '-':
ans = n1 - n2;
break;
case '*':
ans = n1 * n2;
break;
default:
break;
}
nums.push(ans);
}
}
}