问题描述
我正在做一个项目,将中缀表示法转换为后缀表示法,然后计算方程。我为每个运算符建立了优先级。当我使用 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”。