Java实现中缀转后缀时如何识别表达式中的多位数
你的代码无法正确处理多位数的核心原因有两个:
- 拼接完成的多位数加入结果字符串时没有加空格分隔,同时遍历完整个表达式后,末尾剩余的多位数没有被追加到结果中
- 原有括号匹配、栈清空逻辑存在边界漏洞,会导致运算符丢失或者结果拼接错误
核心修改点
- 当数字拼接完成(遇到非数字字符)时,追加
numberInProgress + " "到结果,同时清空numberInProgress避免重复拼接 - 遍历完表达式所有字符后,检查
numberInProgress是否有内容,有的话追加到结果末尾 - 优化括号匹配逻辑,避免空栈异常,匹配到对应左括号后直接弹出丢弃
- 修正最后栈剩余元素弹出的逻辑,避免死循环或者空指针
修改后完整代码
import javax.swing.*; import java.util.Stack; public class InfixToPostfix { public static int Precedence(char c) { return switch (c) { case '+', '-' -> 1; case '*', '/' -> 2; default -> -1; }; } public static boolean isOp(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } public static void convert() { JFrame f = new JFrame(); String eq = JOptionPane.showInputDialog("Enter Equation"); if (eq == null || eq.trim().isEmpty()) { JOptionPane.showMessageDialog(f, "输入不能为空"); return; } Stack<Character> stack = new Stack<>(); StringBuilder postfix = new StringBuilder(); StringBuilder numberInProgress = new StringBuilder(); for(int i=0; i<eq.length(); i++) { char c = eq.charAt(i); // 跳过输入中的空格 if (Character.isWhitespace(c)) { continue; } if(Character.isDigit(c)) { numberInProgress.append(c); continue; } // 遇到非数字,先把之前拼接的完整数字加入结果 if (!numberInProgress.isEmpty()) { postfix.append(numberInProgress).append(" "); numberInProgress.setLength(0); } if(Character.isLetter(c)) { postfix.append(c).append(" "); } else if(isOp(c)) { // 优先级低于等于栈顶就先弹出栈顶运算符 while(!stack.isEmpty() && Precedence(c) <= Precedence(stack.peek()) && stack.peek() != '(' && stack.peek() != '[' && stack.peek() != '{') { postfix.append(stack.pop()).append(" "); } stack.push(c); } else if(c == '(' || c == '[' || c == '{') { stack.push(c); } else if(c == ')' || c == ']' || c == '}') { char matchLeft = switch (c) { case ')' -> '('; case ']' -> '['; case '}' -> '{'; default -> ' '; }; while(!stack.isEmpty() && stack.peek() != matchLeft) { postfix.append(stack.pop()).append(" "); } // 弹出匹配到的左括号,不加入结果 if (!stack.isEmpty()) { stack.pop(); } } } // 遍历完所有字符后,把最后剩余的数字加入结果 if (!numberInProgress.isEmpty()) { postfix.append(numberInProgress).append(" "); } // 清空栈中剩余的运算符 while(!stack.isEmpty()) { char top = stack.pop(); if (top != '(' && top != '[' && top != '{') { postfix.append(top).append(" "); } } JOptionPane.showMessageDialog(f, postfix.toString().trim()); } public static void main(String[] args) { convert(); } }
修改后输入12+3会输出12 3 +,同时支持带括号、多位数、变量混合的表达式,比如输入(123+45)*6会输出123 45 + 6 *,符合后缀表达式的标准格式,可直接用于后续的计算器求值逻辑。
内容的提问来源于stack exchange,提问作者John Silver
相关产品推荐
相关产品推荐

