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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:39:02