0

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

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对象推入堆栈呢?还是我必须单独推动每个字符串?在继续我的在线研究中,似乎堆栈构造函数只能创建一个空堆栈。这就是我不能传递对象参数的原因吗?

4

6 回答 6

2

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

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

或者,您可以在您的Stack类中编写一个“pushAll”方法,该方法接受一个字符串数组并且基本上做同样的事情。

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

PS您的推送方法似乎有一个错误:

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

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

使用此代码,movies[0]将无法为它分配值。

于 2013-03-13T16:21:33.073 回答
2

主要是,您将所有元素隐式放入支持数组中,而无需任何推送操作。您可能想要做的是迭代您想要推送的电影,然后将它们推送进去。

应该做两处改变:

  • 将您的 Stack 对象更改为不再接受字符串数组。这是令人困惑和不必要的,因为所有初始化都是在构造时完成的。
  • 您的 有两个错误push
    • 您没有考虑数组为空的情况。切换顶部的增量,或使用movies[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);
    }
}
于 2013-03-13T16:30:25.413 回答
0

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

于 2013-03-13T16:30:02.857 回答
0

除了这里给出的答案,还记得将从堆栈中弹出的引用设为空。这是《Effective Java》一书中的引述

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

从书中复制的示例:

public Object pop() {
       if (size==0) throw new EmptyStackException();
       Object result = elements[--size];
       elements[size] = null; // Eliminate obsolete reference
       return result;
}
于 2013-03-13T16:39:10.657 回答
0

如果您想使用Stack数据结构并且不想承担成本,Synchronization那么您可以使用Dequeue. StackJava 中可用的类扩展了Vector.

    Deque<Integer> q=new LinkedList<Integer>();
    q.offerFirst(Integer.SIZE);
    q.offerFirst(Integer.SIZE);
    q.pollFirst();

这是 Java 集合框架中可用的最有效的堆栈实现。

于 2013-10-03T18:55:05.023 回答
0

您可能应该将变量初始化为 top=-1。请注意,我没有为此类 Stack 初始化构造函数,因为它不是强制性的。如果没有为类提供用户定义的构造函数,编译器会将成员变量初始化为其默认值。

1.numeric 数据类型设置为0。 2.char 数据类型设置为空字符('\0')。3.reference变量设置为null。以下是完整代码的实现方式:-

 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);
}
 }
public class Stack implements StackInterface
  {


    private final int ARRAY_SIZE = MAX_SIZE;
    private String[] movies = new String[ARRAY_SIZE];   // Hold movie titles
    private int top = -1;


/**
 * Test for full stack
 */

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

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

/**
 * Test for empty stack
 */

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

    top--;
    return movies[top];
}

public void peek()
{
    if(top==-1){
       System.out.println("ERROR: Stack is empty");
            return " ";

    }
else{
  return(movies[top]);
    } }}
于 2018-08-05T12:48:09.403 回答