Java实现前缀表达式转后缀表达式栈运行异常问题求助
前缀转后缀程序问题修复方案
核心问题定位
- 第一个问题:压入反转栈时额外拼接了空格,导致运算符校验全部失效
你在将拆分后的令牌压入reversalStack时执行了reversalStack.push(c + " ");,所有令牌末尾都多了一个空格,而isOperator方法判断的是不带空格的运算符(如*、+),所以所有运算符都被识别为操作数直接压入operandStack,最终弹出栈顶的第一个元素就是你看到的仅输出*的问题。 - 第二个问题:类声明的
Public首字母大写,不符合Java语法规范,会直接编译失败。 - 优化建议:两个栈定义为静态全局变量会导致多次调用方法时残留历史数据,建议移到
convert方法内部作为局部变量。
修复后完整代码
import java.util.Stack; import java.util.StringTokenizer; public class Main { public static void main(String[] args) { String test = "* 2 + 2 - + 12 9 2"; System.out.println(test); System.out.println(new Main().convert(test)); } boolean isOperator(String x){ switch (x){ case "-": case "+": case "/": case "*": case "^": return true; } return false; } public String convert(String expression) { Stack<String> reversalStack = new Stack<>(); Stack<String> operandStack = new Stack<>(); StringTokenizer defaultTokenizer = new StringTokenizer(expression, " ", false); // 压入令牌到反转栈,不再额外加空格 while (defaultTokenizer.hasMoreTokens()) { String c = defaultTokenizer.nextToken(); reversalStack.push(c); } while (!reversalStack.isEmpty()) { String c = reversalStack.pop(); if(!isOperator(c)){ operandStack.push(c + " "); // 这里加空格保证输出的后缀表达式分隔清晰 }else{ String op1 = operandStack.pop(); String op2 = operandStack.pop(); String temp = op1 + op2 + c + " "; operandStack.push(temp); } } String result = operandStack.pop().trim(); // 去掉末尾多余空格 return result; } }
运行结果
测试用例* 2 + 2 - + 12 9 2的输出为:
* 2 + 2 - + 12 9 2 2 12 9 + 2 - 2 + *
符合前缀转后缀的预期结果。
内容的提问来源于stack exchange,提问作者Redwood
相关产品推荐
相关产品推荐

