将中缀转换为后缀并获得 EmptyStackException

问题描述

我正在做一个项目,将中缀表示法转换为后缀表示法,然后计算方程。我为每个运算符建立了优先级。当我使用 ConvertToPostfix 方法时,我得到了异常。我理解反向波兰符号计算器的概念,我只是在用我的代码来做它。我是堆栈溢出的新手,所以如果有些东西看起来有点令人困惑,请告诉我并尝试编辑它。

import java.util.Stack;
public class RPncalctest {

public static void main( String[] args) throws  InvalidInfixEquationException {
    String example= "3+4/3*2"; //postfix notation would be 3 4 3 / 2 * +

    System.out.println(ConvertToPostfix(example));
    // Todo
}
//establish precedence
static int precedence(String c){
    switch(c){
        case"+":
        case"-":
            return 1;
        case"*":
        case"/":
            return 2;

        case")":
            return 3;
        case"(":
            return 4;
        default:
            return -1;
    }
}

// Precondition: every operator/operand will be separated by at least one space
public static String ConvertToPostfix(String infix) throws InvalidInfixEquationException {
    
    String[] tokens = infix.split(" ");
    String result = "";
    Stack<String> stack = new Stack<>();
    for (int i = 0; i < tokens.length; i++) {
        String current = tokens[i];

        if (precedence(current) > 0) {

            while (!stack.isEmpty() && precedence(stack.peek()) >= precedence(current)) {
                result += stack.pop() + " ";
            }
            stack.push(current);
        } else {
            result += current + " ";
        }
    }

    for (int i = 0; i <= stack.size(); i++) {
        result += stack.pop();
    }
    return result;
}

}

Exception in thread "main" java.util.EmptyStackException
at java.base/java.util.Stack.peek(Stack.java:101)
at java.base/java.util.Stack.pop(Stack.java:83)
at RPncalctest.ConvertToPostfix(RPncalctest.java:50)
at RPncalctest.main(RPncalctest.java:7)

解决方法

你的问题就在这里。您弹出的条目比现有条目多一个。

for (int i = 0; i <= stack.size(); i++) {
    result += stack.pop();
}

考虑大小=2。你为 i=0,1,2 执行循环。

我假设“pop”行是堆栈跟踪中指示的第 53 行,因此为了将来参考,这是有用的调试信息,您应该使用它。

如果该循环被编码可能会更清楚:

 while (!stack.isEmpty()) {
      result += stack.pop();
 }

不需要额外的变量“i”。