1

我现在正在学习堆栈,我的代码编译后发现。当我运行它时,代码不会打印我的调试 println 和错误

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.Vector.ensureCapacityHelper(Vector.java:226)
at java.util.Vector.addElement(Vector.java:573)
at java.util.Stack.push(Stack.java:50)
at stacks.main(stacks.java:56)

被陈列。

我的代码如下所示:

import ch03.stacks.*;

import java.util.*;

public class stacks {

public static void main (String []args){

    System.out.printf("Enter a math equation in reverse polish notation:\n");

    Stack<Double> pemdas = new Stack<Double>();

    Scanner input = new Scanner(System.in);
    String in = input.next();

    double temp1, temp2, resultant = 0;


    while(input.hasNext()){
        if(in == "+"){
        temp1 = pemdas.peek();  
        pemdas.pop();
        temp2 = pemdas.peek();
        pemdas.pop();
        resultant = temp1 + temp2;
        pemdas.push(resultant);
        System.out.println(resultant);
        }

        if(in == "-"){
        temp1 = pemdas.peek();  
        pemdas.pop();
        temp2 = pemdas.peek();
        pemdas.pop();
        resultant = temp1 - temp2;
        pemdas.push(resultant);
        System.out.println(resultant);
        }

        if(in == "*"){
        temp1 = pemdas.peek();  
        pemdas.pop();
        temp2 = pemdas.peek();
        pemdas.pop();
        resultant = temp1 * temp2;
        pemdas.push(resultant);
        System.out.println(resultant);
        }

        if(in == "/"){
        temp1 = pemdas.peek();  
        pemdas.pop();
        temp2 = pemdas.peek();
        pemdas.pop();
        resultant = temp1 / temp2;  
        pemdas.push(resultant);
        System.out.println(resultant);
        }

        else
        pemdas.push(Double.parseDouble(in));
        System.out.println(resultant);

        }



    System.out.println("Answer:"+ resultant);
    }
}

因此,我首先以反向波兰表示法读取整数字符串,然后如果它不是操作数,则将其弹出到我的堆栈中。至少这就是我认为它正在做的事情。任何帮助是极大的赞赏。

4

2 回答 2

3

您正在使用peek()which 实际上并没有从输入中删除下一个字符,因此它会不断循环。你需要nextInt()

于 2012-10-25T00:29:07.323 回答
1

您错误地使用了扫描仪 hasNext/next。您应该始终在每个前面next()加上一个hasNext().

在您的代码中,您next()在 while 循环之前调用。然后,您将使用 的返回值hasNext()来终止 while 循环。但是......你永远不会在while循环中调用'next()'。因此hasNext()始终返回 true 并且您处于无限循环中。这 - 结合前面描述的 peek 问题 - 可能会增加你的堆栈,直到你的内存用完。

修复很简单。next()hasNext()while 循环内立即移动

Scanner input = new Scanner(System.in);
double temp1, temp2, resultant = 0;

while(input.hasNext()) {
    String in = input.next();

不幸的是,该程序仍然无法运行,因为您没有正确进行字符串比较。替换如下行:

if (in == "+")

if (in.equals("+"))

希望这只是一个错字。如果您不明白为什么使用 == 进行字符串比较是一个问题,您将需要查看 Java 相等性。

最后,你的 if 逻辑有问题。提示:要处理互斥情况,请使用如下代码:

if () 
{
}
else if ()
{
}
else if ()
{
}
else
{
}
于 2012-10-25T00:57:30.140 回答