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);
        }
    }
}