我正在学习堆栈,我的代码编译找到了。当我运行它时,代码将不会打印我的调试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);
}
}
所以我首先阅读反向波兰表示法中的整数字符串,然后如果它不是一个operatand,那么我将它弹出到我的堆栈。至少这是我认为它正在做的事情。任何帮助是极大的赞赏。
答案 0 :(得分:3)
您正在使用peek()
,它实际上并未从输入中删除下一个字符,因此它会循环播放。您需要nextInt()
;
答案 1 :(得分:1)
您正在使用Scanner hasNext / next错误。您应该始终在每个next()
之前加上hasNext()
。
在您的代码中,您在while循环前面调用next()
。然后,您使用hasNext()
的返回值来终止while循环。但是......你永远不会在while循环中调用'next()'。因此,hasNext()
始终返回true,并且您处于无限循环中。这一点 - 加上前面描述的偷看问题 - 可能会增加你的堆栈,直到你的内存不足为止。
修复很简单。在while循环中next()
之后立即移动hasNext()
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
{
}