用两个栈来做,有些特殊情况需要考虑:
1、+, -, *, / 这四个符号前面有可能会省略0,比如:(-4*2),应该为(0-4*2),所以要在前面加个0,但是,还有中特殊情况不需要加0,比如:(4\2)-3,这种情况,'-'前面不需要加0。综上,只有前面是'(','[','{'这三种情况的话,才需要加0;
2、有大于10的数字存在,所以需要处理10以上情况,具体看代码。

简单说下步骤:

1、新建两个栈,一个栈用来存数字,一个栈用来存运算符
2、遍历整个字符串,如果是数字,入数字栈(考虑10以上情况);如果是普通运算符(考虑省略0情况),入运算符栈;如果是左括号('(', '[', '{'),入运算符栈;如果是右括号(')', ']', '}'),见第三步。
3、如果是右括号(')', ']', '}'),需要出栈操作,出栈到与对应的左括号匹配。我是这么做的,首先新建两个栈,用来存储第一次出栈结果,在出栈的过程中,只计算乘除操作,不计算加减。出栈结束后,新建的两个栈中会存储加减,那么再出栈新建的两个栈,计算加减操作。那么这次操作就是一次括号内的结果,将结果入栈数字栈。
4、第二步和第三步都结束后,那么输入的运算式就结束了,此时有可能运算符栈仍不为空,所以需要再计算运算符栈和数字栈中的结果

代码如下:
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String str = sc.next();
            Stack<Integer> stack1 = new Stack<Integer>(); // 用来存储数字
            Stack<Character> stack2 = new Stack<Character>(); // 用来存储运算符
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                if (Character.isDigit(c)) { // 读取到的字符为数字
                    if (i > 0 && Character.isDigit(str.charAt(i - 1))) {  // 考虑数字大于10的情况
                        stack1.push(stack1.pop() * 10 + (c - 48));
                    } else {
                        stack1.push(c - 48);
                    }
                } else {
                    if (c == ')') {
                        Stack<Integer> stack = new Stack<Integer>(); // 新建一个栈存储本次小括号内的结果
                        Stack<Character> option = new Stack<Character>(); // 新建一个栈存储小括号中的运算符
                        int count = 0;
                        int m = stack1.pop();
                        char o = stack2.pop();
                        while (o != '(') {
                            if (o == '*' || o == '/') { // 对于乘除,需要计算结果
                                int a = stack1.pop();
                                if (o == '*') {
                                    stack1.push(a * m);
                                } else {
                                    stack1.push(a / m);
                                }
                            } else if (o == '+' || o == '-') { // 对于加减,不需要计算结果
                                stack.push(m);
                                option.push(o);
                            }
                            m = stack1.pop();
                            o = stack2.pop();
                        }
                        count += m;
                        while (!option.empty()) { // 上面处理完后,再计算剩下的操作(加减)
                            char op = option.pop();
                            if (op == '+') {
                                count += stack.pop();
                            } else if (op == '-') {
                                count -= stack.pop();
                            }
                        }
                        stack1.push(count);
                    } else if (c == ']') {
                        Stack<Integer> stack = new Stack<Integer>();
                        Stack<Character> option = new Stack<Character>();
                        int count = 0;
                        int m = stack1.pop();
                        char o = stack2.pop();
                        while (o != '[') {
                            if (o == '*' || o == '/') {
                                int a = stack1.pop();
                                if (o == '*') {
                                    stack1.push(a * m);
                                } else {
                                    stack1.push(a / m);
                                }
                            } else if (o == '+' || o == '-') {
                                stack.push(m);
                                option.push(o);
                            }
                            m = stack1.pop();
                            o = stack2.pop();
                        }
                        count += m;
                        while (!option.empty()) {
                            char op = option.pop();
                            if (op == '+') {
                                count += stack.pop();
                            } else if (op == '-') {
                                count -= stack.pop();
                            }
                        }
                        stack1.push(count);
                    } else if (c == '}') {
                        Stack<Integer> stack = new Stack<Integer>();
                        Stack<Character> option = new Stack<Character>();
                        int count = 0;
                        int m = stack1.pop();
                        char o = stack2.pop();
                        while (o != '{') {
                            if (o == '*' || o == '/') {
                                int a = stack1.pop();
                                if (o == '*') {
                                    stack1.push(a * m);
                                } else {
                                    stack1.push(a / m);
                                }
                            } else if (o == '+' || o == '-') {
                                stack.push(m);
                                option.push(o);
                            }
                            m = stack1.pop();
                            o = stack2.pop();
                        }
                        count += m;
                        while (!option.empty()) {
                            char op = option.pop();
                            if (op == '+') {
                                count += stack.pop();
                            } else if (op == '-') {
                                count -= stack.pop();
                            }
                        }
                        stack1.push(count);
                    } else if (c == '+' || c == '-' || c == '*' || c == '/') {
                        if (i == 0 || (!Character.isDigit(str.charAt(i - 1)) && str.charAt(i - 1) != ')' && str.charAt(i - 1) != ']' && str.charAt(i - 1) != '}')) { // 考虑省略0的情况
                            stack1.push(0);
                        }
                        stack2.push(c);
                    } else {
                        stack2.push(c);
                    }
                }
            }
            if (!stack2.empty()) { // 有可能还未运算结束
                Stack<Integer> stack = new Stack<Integer>();
                Stack<Character> option = new Stack<Character>();
                int count = 0;
                int m = stack1.pop();
                char o = stack2.pop();
                while (!stack1.empty()) {
                    if (o == '*' || o == '/') {
                        int a = stack1.pop();
                        if (o == '*') {
                            stack1.push(a * m);
                        } else {
                            stack1.push(a / m);
                        }
                    } else if (o == '+' || o == '-') {
                        stack.push(m);
                        option.push(o);
                    }
                    m = stack1.pop();
                    if (stack2.empty()) {
                        break;
                    } else {
                        o = stack2.pop();
                    }
                }
                count += m;
                do {
                    char op = option.pop();
                    if (op == '+') {
                        count += stack.pop();
                    } else if (op == '-') {
                        count -= stack.pop();
                    }
                } while (!option.empty());
                System.out.println(count);
            } else {
                System.out.println(stack1.pop());
            }
        }
    }
}