只有display()
的第一个电话按预期工作。第一次通话后,tmpStack
为空,因此display()
的第二次通话不会打印任何内容。我怎么能避免这个?
public static void main(String[] args) {
s.display(sortedStack);
s.display(sortedStack);
}
public void display(Stack<Integer> stackToDisplay){
Stack<Integer> tmpStack = stackToDisplay;
while(!tmpStack.isEmpty()){
System.out.println(tmpStack.pop());
}
}
答案 0 :(得分:1)
我想到了两个选择。
选项1 :
如果您不想丢失筹码,请不要弹出元素 - 只需迭代您的筹码:
public void display(Stack<Integer> stackToDisplay){
Stack<Integer> tmpStack = stackToDisplay;
for(Integer element : stackToDisplay) {
System.out.println(element);
}
}
第一次调用后堆栈为空的原因是它得到passed as reference,因此display()
中所做的任何更改都会对您的真实对象产生影响。
这是迭代的另一种方式:
Iterator<Integer> iter = tmpStack.iterator();
while (iter.hasNext()){
System.out.println(iter.next());
}
选项2:
如果您不想要这种行为,可以创建一个对象的副本 - 但我不认为这在您的情况下是必要的。如果您希望以后有两个不同的堆栈,则只需要一份副本。为此,请查看this question,了解其中的工作原理。请注意,复制对象总是比传递引用慢。
答案 1 :(得分:-1)
你想要什么行为?
我通常做这样的事情:
public void display(Stack<Integer> stackToDisplay)
{
Stack<Integer> tmpStack = stackToDisplay;
if(!tmpStack.isEmpty())
{
while(!tmpStack.isEmpty())
{
System.out.println(tmpStack.pop());
}
}
else
{
System.out.println("Stack is empty");
}
}
虽然,你可以把任何你想要的东西放在else块中。
希望这会有所帮助。