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

如何解析无空格后缀表达式?后缀转前缀代码适配问题求助

问题分析与解决方案

问题根源

原代码依赖StringTokenizer按空白字符分割输入,仅能处理操作数与运算符用空格分隔的情况。当输入中存在连续无空格的字符(如测试用例"AB + CD+*"中的AB、CD+)时,StringTokenizer会将这些连续字符视为单个token,导致后续的操作数/运算符判断逻辑失效——比如CD+既不是合法操作数也不是单个运算符,最终引发栈操作错误或语法错误。

解决方案

放弃基于空格的token分割方式,改为逐个遍历输入字符串的每个字符,直接区分操作数与运算符:

  • 跳过输入中的空白字符;
  • 单个非运算符字符直接作为操作数入栈;
  • 遇到运算符时,执行原有的出栈拼接逻辑。

注:以下方案基于操作数为单个字符的场景设计,若需支持多字符操作数,可扩展连续非运算符字符的拼接逻辑。

修改后的代码

class PostfixToPrefix {
    
    public static String Postfix_To_Prefix(String Postfix) throws SyntaxError {
        Stack<String> operand = new Stack<>();
        
        // 遍历输入字符串的每个字符,替代StringTokenizer
        for (int i = 0; i < Postfix.length(); i++) {
            char c = Postfix.charAt(i);
            // 跳过空格
            if (Character.isWhitespace(c)) {
                continue;
            }
            String token = String.valueOf(c);
            
            if (isOperand(c)) {
                operand.push(token);
            } else {
                // 检查栈是否有足够操作数,提前抛出错误
                if (operand.size() < 2) {
                    throw new SyntaxError("Insufficient operands for operator: " + token);
                }
                String operand2 = operand.pop();
                String operand1 = operand.pop();
                String expression = token + " " + operand1 + " " + operand2;
                operand.push(expression);
            }
        }
        
        if (operand.isEmpty()) {
            throw new SyntaxError("Stack is empty");
        }
        String expression = operand.pop();
        
        if (!operand.isEmpty()) {
            throw new SyntaxError("Stack is not Empty");
        }
        
        return expression;
    }
    
    // 简化操作数判断:非运算符即为操作数
    private static boolean isOperand(char c) {
        return c != '+' && c != '-' && c != '*' && c != '/';
    }
}

关键改动说明

  1. 替换Token获取逻辑:用for循环遍历每个字符,跳过空格后直接将单个字符作为token,彻底解决无空格场景的分割问题;
  2. 优化操作数判断:将字符串判断改为单个字符判断,逻辑更简洁准确;
  3. 增加前置校验:处理运算符前先检查栈中操作数数量,提前抛出明确的语法错误;
  4. 修复拼写错误:修正原代码中experssion的拼写错误为expression。

测试验证

对于测试用例"AB + CD+*",代码会自动拆分为A、B、+、C、D、+、*,最终转换为前缀表达式* + A B + C D。

内容的提问来源于stack exchange,提问作者Aziz Aljuaid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:26:20