2

对于一项任务,我必须编写一个打印堆栈的方法,这部分很容易

public void print(stack s)
{
   while(!isEmpty())
   {
      System.out.println(s.peek());
      s.pop();
   }

}

问题是在我打印堆栈之后,我的任务是打印堆栈上的底部元素,这不再是因为我在我的打印方法中使用了 s.pop() 。这是我打印底部元素的代码。

public void bottom(stack s)
{
  if(isEmpty())
   {
     System.out.println("Stack is empty");
   }
  else
   {
     System.out.println(stackArray[0]);
   }
}

我的问题是:我应该如何修改打印方法,这样我就不必从堆栈中弹出元素?还是有另一种方法可以使堆栈在使用 print 方法后仍然保留我的元素?

根据要求,这是我们在课堂上使用的堆栈(大部分是荷兰语):

public class MyStack
{
    protected Object[ ] stackArray;
    protected int top;
    private int grootte;
    private static final int DEFAULT_GROOTTE = 10;

    public MyStack( )
    {
        grootte = DEFAULT_GROOTTE;
        stackArray = new Object[grootte];
        top = 0;
    }

    public boolean isEmpty( )
    {
        if (top == 0)
                return true;
            else 
                return false;
    }

    public void push(Object e)
    {
        if (top == grootte)
            allocateMore( );
        stackArray[top] = e;
        top++;
    }

    public Object pop( )
    {
            if(isEmpty( ))
            {
                System.out.println("Stack leeg : er kan geen element van de stack afgehaald worden.");
                return null;
            }
                    top--;
                    return stackArray[top];

}
    public Object peek( )
    {
            if(isEmpty( ))
            {
                System.out.println("Stack leeg : er kan geen topelement van de stack getoond worden.");
                return null;
            }
                    return stackArray[top-1];
    }

    public int size( )
    {
        return top;
    }

    private void allocateMore( )
    {
        Object[ ] original = stackArray;
        grootte = grootte * 2;
        stackArray = new Object[ grootte];
        for(int i = 0; i < grootte/2; i++)
        {
            stackArray[i] = original[i];
    }
    }

}

因为我的代表不够高,无法回答我自己的问题,所以快速编辑

我想我找到了另一种使用它来打印堆栈的方法

public void print(stack s)
{
 for(int i =top-1; i>=0;i--)
   System.out.println(stackArray[i]);
}

这可能不是最好的方法,但它正在工作:P

4

4 回答 4

5

如果您使用内置java.util.Stack类型,则它派生自Vector,因此您可以使用它getElement(int)来读取任何堆栈深度的元素。

如果这是您自己的代码,则必须添加一个方法来执行相同的操作。

或者,您可以将元素弹出到另一个堆栈或List类型中,然后在打印后重建堆栈,但这会非常低效,您的老师很可能会对这样的解决方案皱眉。

于 2013-04-18T12:05:03.190 回答
4

如果您只想查看没有任何花哨的内容的内容,有一个简单的解决方法。

System.out.println(Arrays.toString(myStack.toArray()));
于 2016-01-26T07:55:16.647 回答
0

使用Iterator循环堆栈,因为它们适用于任何 Collection 对象。

于 2017-11-22T08:31:43.390 回答
0
if (!_stack.empty())

检查堆栈是否为空

for(int i=_stack.size()-1; i>=0;i--)  
System.out.println(_stack.get(i));

获取堆栈值

于 2016-07-25T07:21:13.870 回答