0

スタックがどのように機能するかは理解していますが、プッシュ、ポップ、ピークのメソッドを作成してから、ドライバー クラスに実装する必要があります。ここがややこしいところです。これが私の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

主に、すべての要素をプッシュ操作なしで暗黙的にバッキング配列に配置しています。おそらくやりたいことは、プッシュしたい映画を繰り返し処理してから、それらをプッシュすることです.

次の 2 つの変更を行う必要があります。

  • Stack オブジェクトを変更して、文字列の配列を受け入れないようにします。初期化はすべて構築時に行われるため、これは紛らわしく不要です。
  • には 2 つのバグがありますpush
    • 配列が空の場合は考慮しません。top の増分を切り替えるか、 を使用します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 に答える
2

配列の各要素をスタックにプッシュする必要があります。

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

または、クラスに「pushAll」メソッドを記述Stackして、文字列配列を受け入れ、基本的に同じことを行うこともできます。

ただし、コンストラクターで既にムービー配列を設定しているように見えるため、への呼び出しの目的がわかりませんpush。おそらく、あなたはさらに説明することができます。

PS push メソッドにバグがあるようです:

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 に答える
0

プッシュ メソッドは、文字列の配列ではなく文字列を引数として想定するため、文字列配列を引数として受け入れるようにプッシュ メソッドを変更するか、一度に 1 つの文字列を現在のプッシュ メソッドに渡すことができます。また、oscarStack オブジェクトをプッシュしていません。任意のオブジェクトをプッシュしたい場合は、メソッド シグネチャがそれをサポートする必要があります。

于 2013-03-13T16:30:02.857 に答える
0

ここでの回答とは別に、スタックからポップされた参照を null にすることも忘れないでください。これは「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 に答える