好久之前写过一篇关于四则运算的题解 https://www.nowcoder.com/discuss/353149040202293248
回头再看已经有点麻了 看了下热门题解的思路 自己重新用逆波兰写了下
import java.util.*; /** * @author hll[yellowdradra@foxmail.com] * @date 2022-10-10 21:03 **/ public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String expression = in.nextLine(); // 拆分表达式 e.g. "2+5" -> "2" "+" "5" List<String> infix = splitExpression(expression); // 将中缀表达式转换为后缀表达式 List<String> suffix = infix2suffix(infix); // 逆波兰算法 LinkedList<Integer> numberStack = new LinkedList<>(); for (String op : suffix) { // 如果op是运算符 则弹出运算数栈numberStack的两个运算数进行运算 if (isOperation(op)) { // 注意先出栈的是运算数2 完了是运算数1 四则运算中"-","/"的运算结果是与运算数的顺序是相关的 numberStack.push(operate(numberStack.pop(), numberStack.pop(), op)); } else { numberStack.push(Integer.parseInt(op)); } } System.out.println(numberStack.pop()); } static Integer operate(Integer operator2, Integer operator1, String operation) { Integer result = 0; switch (operation) { case "+": result = operator1 + operator2; break; case "-": result = operator1 - operator2; break; case "*": result = operator1 * operator2; break; case "/": result = operator1 / operator2; break; default: break; } return result; } static List<String> splitExpression(String expression) { // 为了方便拆分 先对表达式进行预处理 expression = expression .replaceAll("\\{|\\[", "(") .replaceAll("\\}|\\]", ")") .replaceAll(" ", ""); List<String> infix = new ArrayList<>(); for (int i = 0; i < expression.length();) { int j = i; // 考虑几种 "-" 作为运算数的符号 而不是运算符的情况 // '-' 开头 && 后一位是数字的 有可能是负数 // 情况1: '-'号位于第一位 "-2"; // 情况2: '-'号位于左括号后面 "2+(-3)" boolean isNegativeNumber = expression.charAt(j) == '-' && Character.isDigit(expression.charAt(j + 1)) && (j == 0 || '(' == expression.charAt(j - 1)); // 正数情况 根据题意 不考虑浮点数 boolean isPositiveNumber = Character.isDigit(expression.charAt(j)); if (isNegativeNumber || isPositiveNumber) { // 如果是负数 那么要从负号后一位开始找0-9的数字 一直找到找不到为止 j = isNegativeNumber ? j + 1 : j; while (j < expression.length() && Character.isDigit(expression.charAt(j))) { j++; } infix.add(expression.substring(i, j)); i = j; } else { infix.add(String.valueOf(expression.charAt(i++))); } } return infix; } static List<String> infix2suffix(List<String> infix) { List<String> suffix = new ArrayList<>(); LinkedList<String> stack1 = new LinkedList<>(); LinkedList<String> stack2 = new LinkedList<>(); for (String op : infix) { if (isOperation(op)) { if (stack1.isEmpty() || "(".equals(op)) { stack1.push(op); } else { // stack1 非空 且 op为右括号 if (")".equals(op)) { // 把stack1里左括号之前的运算数/符 全部倒入stack2 while (!"(".equals(stack1.peek())) { stack2.push(stack1.pop()); } // 丢掉左括号 stack1.pop(); } else { // 如果op是 + - * / while (!stack1.isEmpty() && higherPriority(stack1.peek(), op)) { stack2.push(stack1.pop()); } stack1.push(op); } } } else { stack2.push(op); } } // stack1 剩余操作符全部倒入 stack2 while (!stack1.isEmpty()) { stack2.push(stack1.pop()); } // 利用LinkedList的双端队列性质倒序输出stack2的数 while (!stack2.isEmpty()) { suffix.add(stack2.removeLast()); } return suffix; } static boolean isOperation(String op) { // 四则运算("+", "-", "*", "/")的运算符长度都为1 return op.length() == 1 && !Character.isDigit(op.charAt(0)); } static boolean higherPriority(String operate1, String operate2) { return priority(operate1) - priority(operate2) >= 0; } static int priority(String operate) { // "+" "-" 优先级为0 "*" "/" 优先级为1 if ("+".equals(operate) || "-".equals(operate)) { return 0; } else if ("*".equals(operate) || "/".equals(operate)){ return 1; } else { return -1; } } }