Java中的堆栈推送,弹出,窥视算法

时间:2013-03-13 16:19:20

标签: java algorithm stack

我理解堆栈是如何工作的,但我必须为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对象推入堆栈?或者我必须单独推每个字符串?在继续我的在线研究中,似乎堆栈构造函数只能创建一个空堆栈。这就是我无法传递对象参数的原因吗?

6 个答案:

答案 0 :(得分:2)

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

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

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

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

P.S。您的推送方法似乎有一个错误:

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

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

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

答案 1 :(得分:2)

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

应该进行两项更改:

  • 将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);
    }
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

除了这里给出的答案外,还要记住将从堆栈中弹出的引用置空。 以下是“Effective Java”一书的引用

  

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

从书中复制的样本:

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

答案 4 :(得分:0)

如果您想使用Stack数据结构而又不想承担Synchronization的费用,那么您可以使用Dequeue。 Java中提供的Stack类扩展了Vector

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

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

答案 5 :(得分:0)

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

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

 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]);
    } }}