中缀表达式转后缀表达式求值
后缀表达式就是声明两个栈,将操作符和操作数插入分别push操作数和操作符中,在操作符中遇到push操作符号优先级小于栈顶的数,那么将其出栈到操作数中,特殊字符:“{[(”等要遇到相反的才出栈且不放入操作数中。

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = "";
        while((line=br.readLine())!=null) {
            // List 存放后缀表达式
            List<String> list = new ArrayList<>();
            // 定义操作符栈stack,用于存放操作符 + - * / (
            Stack<Character> stack = new Stack<>();
            for(int i=0;i<line.length();i++) {
                // 定义一个字符,记录字符串当前循环的变量
                char c = line.charAt(i);
                // 取出以当前字符开头数字结尾的整数字符串进行判定是否为数字
                if (isNum(c)) {
                    int start = i; //记录开头数字的
                    if(i==line.length()-1) {
                        i++;     //加1,因为subString取值是前闭后开
                    }else {
                        while(isNum(line.charAt(++i))) {   //先加减再运算,因为subString取值是前闭后开
                        }
                    }
                    list.add(line.substring(start,i));
                    i--;
                }else if(c=='(' || c=='[' || c=='{') {  //为左括号,则入栈
                    stack.push(c);
                }else if(c==')' || c==']' || c=='}') {   //为右括号,则
                    while (stack.peek()!='(' && stack.peek()!='[' && stack.peek()!='{') {
                        list.add(String.valueOf(stack.pop()));
                    }
                    stack.pop();
                }else if(c=='-') {
                    //判断是减号还是负号
                    if((i!=0 && (isNum(line.charAt(i-1)) && isNum(line.charAt(i+1)))) || (line.charAt(i-1)==')' || line.charAt(i-1)==']' || line.charAt(i-1)=='}') || (line.charAt(i+1)=='(' || line.charAt(i+1)=='[' || line.charAt(i+1)=='{')) { //减号
                        // 优先级 小于 栈顶运算符
                        while(!greaterThan(c,stack)) {
                            list.add(String.valueOf(stack.pop()));
                        }
                        stack.push(c);
                    }else { //负号
                        int start = i;
                        while(isNum(line.charAt(++i))) {
                        }
                        list.add(line.substring(start,i));
                        i--;
                    }
                }else if(c=='+' || c=='*' || c=='/') {
                    while(!greaterThan(c, stack)) {
                        list.add(String.valueOf(stack.pop()));
                    }
                    stack.push(c);
                }
            }
            while(!stack.isEmpty()) {
                list.add(String.valueOf(stack.pop()));
            }

//            System.out.println(list.toString());
            //计算后缀表达式
            int result = calculate(list);
            System.out.println(result);
        }
    }
    //判断是否为数字
    public static boolean isNum(char c) {
        return (c>='0' && c<='9');
    }
    // 比较运算符与栈顶运算符的优先级
    public static boolean greaterThan(char c,Stack<Character> stack) {
        if(stack.isEmpty()) {
            return true;
        }else {
            char c1 =stack.peek();
            if(c=='*' || c=='/') {
                return !(c1=='*' || c1=='/');
            }else{
                return (c1=='(' || c1=='[' || c1=='{' );
            }
        }
    }
    public static int calculate(List<String> list) {
        // 定义数字栈,存放后缀表达式计算过程中的值
        Stack<Integer> stack = new Stack<>();
        int n1,n2;
        for (int i = 0; i < list.size(); i++) {
            switch (list.get(i)) {
            case "+":
                stack.push(stack.pop()+stack.pop());
                break;
            case "-":
                n1 = stack.pop();
                n2 = stack.pop();
                stack.push(n2-n1);
                break;
            case "*":
                stack.push(stack.pop()*stack.pop());
                break;
            case "/":
                n1 = stack.pop();
                n2 = stack.pop();
                stack.push(n2/n1);
                break;
            default:
                stack.push(Integer.parseInt(list.get(i)));
            }
        }
        return stack.pop();
    }
}