我正在尝试在Java中为学校的表达式树程序做一个中缀,为了做到这一点,我试图实现一个后缀队列,它是在传递了一个中缀字符串之后构造的,在这个队列中,我使用Java堆栈来持有操作符和左括号,对于shunting-yard算法,表达式树必须使用泛型节点来持有char/int。
当我的程序尝试推送遇到的第一个'(‘时,我遇到了堆内存错误
"Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.Arrays.copyOf(Arrays.java:3511)
at java.base/java.util.Arrays.copyOf(Arrays.java:3480)
at java.base/java.util.Vector.grow(Vector.java:262)
at java.base/java.util.Vector.grow(Vector.java:266)
at java.base/java.util.Vector.add(Vector.java:782)
at java.base/java.util.Vector.addElement(Vector.java:617)
at java.base/java.util.Stack.push(Stack.java:66)
at project01/project1.PostfixQueue.<init>(PostfixQueue.java:128)
at project01/project1.ExpressionTree.<init>(ExpressionTree.java:22)
at project01/project1.Driver.main(Driver.java:11)" public PostfixQueue(String infix) {
Stack<Character> opStack = new Stack<Character>();
PostfixQueue postQueue = new PostfixQueue();
Character digit;
int numDigits = 0, result = 0;
while(infix.length() > 0) {
digit = (Character) infix.charAt(0);
switch(digit) {
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '0':
if(numDigits > 0) {
result = (result * 10) + Character.getNumericValue(digit); //if a result int is previously stored (multi digit int in the string)
if(infix.charAt(1) >= 48 && infix.charAt(1) <= 57) {
numDigits++;
}
else {
//output result
postQueue.Enqueue(result);
numDigits = 0; //reset numDigits
}
}
else if(numDigits == 0) {
if(infix.charAt(1) >= 48 && infix.charAt(1) <= 57) { //If next input is a number w/o whitespace (ex: 45)
numDigits++;
result = Character.getNumericValue(digit);
}
else {
numDigits = 0; //reset numDigits
//output result
postQueue.Enqueue(result);
}
} //End else if
break;
case '+':
case '-':
if(opStack.empty() || opStack.peek() == '(')
{
opStack.push(digit);
}
else{
while(opStack.peek() == '+' || opStack.peek() == '-' || opStack.peek() == '*' || opStack.peek() == '/') {
//Pop operator and queue it
postQueue.Enqueue(opStack.pop());
}// end while
}// end else
opStack.push(digit);
break;
case '*':
case '/':
while(opStack.peek() == '*' || opStack.peek() == '/') {
//Pop operator and queue it
postQueue.Enqueue(opStack.pop());
}//end while
opStack.push(digit);
break;
case '(':
opStack.push(digit);
break;
case ')':
while(opStack.peek() != '(') {
//Pop operator and queue it
postQueue.Enqueue(opStack.pop());
}// end while
opStack.pop();
break;
} // End Switch Statement
infix.substring(1);
} // End While Statement
this.first = postQueue.GetFirst();
} // End Constructor“”“
错误出现在"opStack.push(digit)“处
顶部错误语句第3511行的变量是: copyOf()抛出OutOfMemoryError (id=20)
我如何解决这个问题,这样我才能真正测试整个类的其余部分和其他类的逻辑是否工作?
发布于 2021-09-12 01:46:18
我发现了问题,我不是偶然地改变了我的循环条件,在接近底部的地方,infix.substring(1);应该是infix = infix.substring(1);,我的程序试图创建一个无限的左括号堆栈。
https://stackoverflow.com/questions/69147345
复制相似问题