首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试在Java中将单个字符推送到Stack时堆内存不足

尝试在Java中将单个字符推送到Stack时堆内存不足
EN

Stack Overflow用户
提问于 2021-09-11 23:12:42
回答 1查看 42关注 0票数 0

我正在尝试在Java中为学校的表达式树程序做一个中缀,为了做到这一点,我试图实现一个后缀队列,它是在传递了一个中缀字符串之后构造的,在这个队列中,我使用Java堆栈来持有操作符和左括号,对于shunting-yard算法,表达式树必须使用泛型节点来持有char/int。

当我的程序尝试推送遇到的第一个'(‘时,我遇到了堆内存错误

代码语言:javascript
复制
"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)"
代码语言:javascript
复制
    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)

我如何解决这个问题,这样我才能真正测试整个类的其余部分和其他类的逻辑是否工作?

EN

回答 1

Stack Overflow用户

发布于 2021-09-12 01:46:18

我发现了问题,我不是偶然地改变了我的循环条件,在接近底部的地方,infix.substring(1);应该是infix = infix.substring(1);,我的程序试图创建一个无限的左括号堆栈。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69147345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档