解题思路的关键在于:

当判断到该字符为运算符号时,将该运算符号之前的数字按上一个运算符号push到stack中。此次判断得到的运算符号,将用作下一个位置数字的push。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String input = scan.nextLine();

        //替换括号为小括号"()"
        input.replace("{", "(");
        input.replace("}", "(");
        input.replace("[", "(");
        input.replace("]", "(");

        //输出结果
        System.out.println(solve(input));
    }

    public static int solve(String input) {
        Stack<Integer> stack = new  Stack<>(); //将每个求和数放入栈中
        char[] chars = input.toCharArray();
        int n = chars.length;

        int num = 0; //初始化数字
        char sign = '+'; //初始化+号,保证第一个数字的输入
        //逐字符进行判断
        for (int i = 0; i < n; i++) {
            char item = chars[i];

            //如果为空字符
            if (item == ' ') continue;
            //如果为数字
            if (Character.isDigit(item)) {
                num = num * 10 + item - '0';
            }
            //如果为括号,则明确括号位置,将括号内容进行solve求解,并将指针放到括号外
            if (item == '(') {
                int count = 1; //统计括号的次数,以此判定括号是否结束
                int j = i + 1;
                while (count > 0) {
                    if (chars[j] == '(') count++;
                    if (chars[j] == ')') count--;
                    j++;
                }
                //已明确括号的位置为i,j-1
                num = solve(input.substring(i + 1, j - 1));
                //得到括号内的结果后,调整指针位置
                i = j - 1;
            }
            //如果不为数字和括号,则判断具体的法则
            if (item == '+' || item == '-' || item == '*' || item == '/' || i == n - 1) {
                if (sign == '+') {
                    stack.push(num);
                } else if (sign == '-') {
                    stack.push(-1 * num);
                } else if (sign == '*') {
                    stack.push(stack.pop() * num);
                } else if (sign == '/') {
                    stack.push(stack.pop() / num);
                }
                //将求和数填充入stack中后,需要更新加减乘除
                sign = item;
                //运行过一次运算后,将num刷新,防止下一个数字num=num*10+item-'0'有影响
                num = 0;
            }
        }
        int sum = 0;
        while (!stack.empty()) {
            sum += stack.pop();
        }
        return sum;
    }

}