如何解析无空格后缀表达式?后缀转前缀代码适配问题求助
问题分析与解决方案
问题根源
原代码依赖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 != '/'; } }
关键改动说明
- 替换Token获取逻辑:用
for循环遍历每个字符,跳过空格后直接将单个字符作为token,彻底解决无空格场景的分割问题; - 优化操作数判断:将字符串判断改为单个字符判断,逻辑更简洁准确;
- 增加前置校验:处理运算符前先检查栈中操作数数量,提前抛出明确的语法错误;
- 修复拼写错误:修正原代码中
experssion的拼写错误为expression。
测试验证
对于测试用例"AB + CD+*",代码会自动拆分为A、B、+、C、D、+、*,最终转换为前缀表达式* + A B + C D。
内容的提问来源于stack exchange,提问作者Aziz Aljuaid
相关产品推荐
相关产品推荐

