我该如何显示堆栈?

时间:2014-08-20 23:24:35

标签: java stack

只有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());
    }
}

2 个答案:

答案 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块中。

希望这会有所帮助。