You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现中缀转后缀时如何识别表达式中的多位数

你的代码无法正确处理多位数的核心原因有两个:

  1. 拼接完成的多位数加入结果字符串时没有加空格分隔,同时遍历完整个表达式后,末尾剩余的多位数没有被追加到结果中
  2. 原有括号匹配、栈清空逻辑存在边界漏洞,会导致运算符丢失或者结果拼接错误

核心修改点

  • 当数字拼接完成(遇到非数字字符)时,追加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:06:03