public static void main(String[] args) { String sun = "3+2*-3*4-1"; Stack<Character> stack = new Stack<>(); Stack<Double> numbers = new Stack<>(); List<Character> operator = Arrays.asList('+', '-', '*', '/'); String str = ""; for (int i = 0; i < sun.length(); i++) { char c = sun.charAt(i); if (operator.contains(c)) { if (c == '-' && str == "") { str += c; continue; } else if (!StringUtils.isEmpty(str)) { numbers.push(Double.parseDouble(str)); str = ""; } // 当前操作符的优先级小于栈顶部的优先级,则需出栈计算 if (!stack.isEmpty() && comparOperation(c) <= comparOperation(stack.peek())) { Character oper = stack.pop(); double number1 = numbers.pop(); double number2 = numbers.pop(); double result = getResult(oper, number2, number1); numbers.push(result); } stack.push(c); } else if ('(' == c) { stack.push(c); } else if (')' == (c)) { if (!StringUtils.isEmpty(str)) { numbers.push(Double.parseDouble(str)); str = ""; } Character oper; while ((oper = stack.pop()) != '(' && !stack.empty()) { double number1 = numbers.pop(); double number2 = numbers.pop(); double result = getResult(oper, number2, number1); numbers.push(result); } } else { str += c; } } if (!StringUtils.isEmpty(str)) { numbers.push(Double.parseDouble(str)); } // 栈后计算 while (!stack.isEmpty()) { Character oper = stack.pop(); double number1 = numbers.pop(); double number2 = numbers.pop(); double result = getResult(oper, number2, number1); numbers.push(result); } DecimalFormat decimalFormat = new DecimalFormat("#0"); System.out.println(decimalFormat.format(numbers.pop())); } // 比较操作符优先级 private static int comparOperation(Character o1){ if (o1 == '+' || o1 == '-') { return 0; } else if (o1 == '*' || o1 == '/'){ return 1; } else { return -1; } } private static double getResult(Character oper, double num1, double num2) { if (oper == '+') { return num1 + num2; } else if (oper == '-') { return num1-num2; } else if (oper == '*') { return num1 * num2; } else if (oper == '/') { return num1 / num2; } else { return 0; } }