Java中的堆栈推送、pop、peek算法

Java中的堆栈推送、pop、peek算法,java,algorithm,stack,Java,Algorithm,Stack,我了解栈是如何工作的,但我必须为push、pop和peek编写方法,然后在驱动程序类中实现它们。这就是让人困惑的地方。这是我的堆栈类: public class Stack implements StackInterface { private final int ARRAY_SIZE = 9; private String[] movies = new String[ARRAY_SIZE]; // Hold movie titles private int top

我了解栈是如何工作的,但我必须为push、pop和peek编写方法,然后在驱动程序类中实现它们。这就是让人困惑的地方。这是我的
堆栈
类:

public class Stack implements StackInterface
{
    private final int ARRAY_SIZE = 9;
    private String[] movies = new String[ARRAY_SIZE];   // Hold movie titles
    private int top = 0;

    /**
     * Constructor
     * @param moviesIn
     */

    public Stack(String[] moviesIn)
    {
        movies = moviesIn;
    }

    /**
     * Test for full stack
     */

    public void push(String moviesIn)
    {
        if (top >= movies.length)
            System.out.println("ERROR: Stack is full");

        top++;
        movies[top] = moviesIn;
    }

    /**
     * Test for empty stack
     */

    public String pop()
    {
        if (top == 0) {
                System.out.println("ERROR: Stack is empty");
                return " ";
        }

        top--;
        return movies[top];
    }

    public void peek()
    {
        // ???
    }
}
以下是迄今为止我在
main()
方法中的内容:

public static void main(String[] args) 
{
    String[] movies = {"Amour", "*Argo", "Beasts of the Southern Wild", "Django Unchained", "Les Misérables", "Life of Pi", "Lincoln", "Silver Linings Playbook", "Zero Dark Thirty"};
    Stack oscarStack = new Stack(movies);

    oscarStack.push(movies);
}

我以为我可以将一个对象传递到堆栈,但它似乎不是这样工作的。那么如何将
oscarStack
对象推送到堆栈上呢?或者我必须单独推动每根弦吗?在继续我的在线研究时,堆栈构造函数似乎只能创建一个空堆栈。这就是我无法传递对象参数的原因吗?

必须将数组的每个元素推送到堆栈上:

for (String movie : movies) {
    oscarStack.push(movie);
}
或者,您可以在
堆栈
类中编写一个“pushAll”方法,该方法接受字符串数组并基本上执行相同的操作

但是,您似乎已经在构造函数中设置了movies数组,因此我看不出调用
push
的目的。也许你可以进一步解释

另外,您的推送方法中似乎有一个错误:

public void push(String moviesIn)
{
    if (top >= movies.length)
        System.out.println("ERROR: Stack is full");

    top++;
    movies[top] = moviesIn;
}

有了这个代码,
movies[0]
就不可能被赋值。

您必须将数组的每个元素推到堆栈上:

for (String movie : movies) {
    oscarStack.push(movie);
}
或者,您可以在
堆栈
类中编写一个“pushAll”方法,该方法接受字符串数组并基本上执行相同的操作

但是,您似乎已经在构造函数中设置了movies数组,因此我看不出调用
push
的目的。也许你可以进一步解释

另外,您的推送方法中似乎有一个错误:

public void push(String moviesIn)
{
    if (top >= movies.length)
        System.out.println("ERROR: Stack is full");

    top++;
    movies[top] = moviesIn;
}

有了这段代码,
movies[0]
就不可能被赋值。

推送方法需要一个字符串作为参数,而不是字符串数组,因此您可以更改推送方法以接受字符串数组作为参数,或者一次将一个字符串传递给当前的推送方法。
另外,您没有推送oscarStack对象,如果您想再次推送任何对象,方法签名应该支持这一点。

推送方法需要一个字符串作为参数,而不是字符串数组,因此您可以更改推送方法以接受字符串数组作为参数,或者一次将一个字符串传递给当前的推送方法。
此外,您没有推送oscarStack对象,如果您想再次推送任何对象,方法签名应该支持该操作。

主要是,您将所有元素隐式地放入后备数组,而不进行任何推送操作。你可能想做的是迭代你想推的电影,然后把它们推进去

应作出两项修改:

  • 将堆栈对象更改为不再接受字符串数组。由于所有的初始化都是在构造时完成的,因此这是令人困惑的,并且没有必要的
  • 您的
    推送有两个错误:
    
    • 您不考虑数组为空的情况。切换top的增量,或使用
      电影[top++]
    • 如果数组已满,实际上不会阻止代码执行。如果您尝试使用现有资源运行,您将获得
      ArrayIndexOutOfBoundsException

public static void main(String[] args)  {
   String[] movies = {"Amour", "*Argo", "Beasts of the Southern Wild", "Django Unchained", "Les Misérables", "Life of Pi", "Lincoln", "Silver Linings Playbook", "Zero Dark Thirty"};
    Stack oscarStack = new Stack();

    for(String movie : movies) {
        oscarStack.push(movie);
    }
}

大体上,您将所有元素隐式地放入支持数组中,而不进行任何推操作。你可能想做的是迭代你想推的电影,然后把它们推进去

应作出两项修改:

  • 将堆栈对象更改为不再接受字符串数组。由于所有的初始化都是在构造时完成的,因此这是令人困惑的,并且没有必要的
  • 您的
    推送有两个错误:
    
    • 您不考虑数组为空的情况。切换top的增量,或使用
      电影[top++]
    • 如果数组已满,实际上不会阻止代码执行。如果您尝试使用现有资源运行,您将获得
      ArrayIndexOutOfBoundsException

public static void main(String[] args)  {
   String[] movies = {"Amour", "*Argo", "Beasts of the Southern Wild", "Django Unchained", "Les Misérables", "Life of Pi", "Lincoln", "Silver Linings Playbook", "Zero Dark Thirty"};
    Stack oscarStack = new Stack();

    for(String movie : movies) {
        oscarStack.push(movie);
    }
}

除了这里给出的答案外,还要记住将从堆栈中弹出的引用设为null。 这里引用了《有效Java》一书中的一段话

一般来说,每当类管理自己的内存时 程序员应该警惕内存泄漏。每当一个元素 释放时,元素中包含的任何对象引用都应为空 出去

从书中复制的样本:

public Object pop() {
       if (size==0) throw new EmptyStackException();
       Object result = elements[--size];
       elements[size] = null; // Eliminate obsolete reference
       return result;
}

除了这里给出的答案外,还要记住将从堆栈中弹出的引用设为null。 这里引用了《有效Java》一书中的一段话

一般来说,每当类管理自己的内存时 程序员应该警惕内存泄漏。每当一个元素 释放时,元素中包含的任何对象引用都应为空 出去

从书中复制的样本:

public Object pop() {
       if (size==0) throw new EmptyStackException();
       Object result = elements[--size];
       elements[size] = null; // Eliminate obsolete reference
       return result;
}

如果您想使用
堆栈
数据结构,并且不想承担
同步
的成本,那么您可以使用
出列
<代码>堆栈
Java中可用的类扩展了向量

    Deque<Integer> q=new LinkedList<Integer>();
    q.offerFirst(Integer.SIZE);
    q.offerFirst(Integer.SIZE);
    q.pollFirst();
Deque q=newlinkedlist();
q、 offerFirst(整数大小);
q、 offerFirst(整数大小);
q、 pollFirst();

这是Java collection framework中可用的最有效的堆栈实现。

如果您想使用
堆栈
数据结构,并且不想承担
同步的成本,那么您可以使用
出列
<代码>堆栈
Java中可用的类扩展了向量

    Deque<Integer> q=new LinkedList<Integer>();
    q.offerFirst(Integer.SIZE);
    q.offerFirst(Integer.SIZE);
    q.pollFirst();
Deque q=newlinkedlist();
q、 offerFirst(整数大小);
q、 offerFirst(整数大小);
q、 pollFirst();

这是Java collection framework中可用的最有效的堆栈实现。

您可能应该将变量初始化为top=-1。请注意,我尚未初始化此clas的构造函数