1

配列からスタックを埋めてから、要素を順番に出力してから、順番を逆にする必要があります。私が問題を抱えているのは、ArrayIndexOutOfBoundsException を取得していて、それがどこから来ているのかわからないことです。デバッグを実行しようとしましたが、最後の要素に到達しない要素をポップオフしているように見えます。以下は私のコードです:

public class arrayStack {

    private int top;
    private String[] storage;

    public arrayStack(int capacity)
    {
        storage = new String[capacity];
        top = -1;
    }

    public boolean isEmpty() {
        return (top == 0);
    }

    String peek() {
        return storage[top];    
    }

    String pop() {
        top--;
        return storage[top];
    }

    public void push(String str) {
        top++;
        storage[top] = str;
    }

}

StackMain.java:

public class StackMain {

    public static void main(String[] args) {
        //int j = 5;
        String[] list = new String[5];

        list[0] = "Beware";
        list[1] = "The";
        list[2] = "Ides";
        list[3] = "Of";
        list[4] = "March";

        arrayStack stack = new arrayStack(5);

        for(int i = 0; i < list.length; i++)
        {
            stack.push(list[i]);
        }

        for(int j = 0; j < list.length; j++)
            System.out.println(stack.pop());

    }

}
4

8 に答える 8

3

ではpop()、ポップされたアイテムを返す必要があります。これは、 の古い値のインデックスにあるアイテムですtop。最もクリーンな方法は、関数を次のように変更することです

String pop() {
    return storage[top--];
}

編集に変更する
必要もあります。他の人が言及したように、(最高の要素のインデックス) の代わりに (要素の数)を使用するように実装を変更することもできます。isEmpty()return (top == -1)sizetop

于 2012-02-29T02:20:02.943 に答える
1

スタックを実装するためにJava 1.5ジェネリック機能を含めることができれば素晴らしいでしょう。そうすれば、スタックはより柔軟になります。あらゆるタイプのオブジェクトを保持できます(この場合は文字列のみ)次のように poped オブジェクトに破棄するガベージ コレクター。(ジェネリックを使用している場合) 以下は、有効な Java エディション 2 で言及されている、より柔軟なスタックの実装です。

// Initial attempt to generify Stack = won’t compile!
public class Stack<E> {
private E[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack() {
elements = (E[])new E[DEFAULT_INITIAL_CAPACITY];
}
public void push(E e) {
ensureCapacity();
elements[size++] = e;
}
public E pop() {
if (size==0)
throw new EmptyStackException();
E result = elements[--size];
elements[size] = null; // Eliminate obsolete reference
return result;
}
于 2012-02-29T03:00:32.017 に答える
1

のコンストラクタでは、-1 ではなく 0 にarrayStack設定する必要があります。topあなたのisEmptyメソッドでは、それをチェックすることさえするtop == 0ので、明らかtop == 0に ではなく空を意味しますtop == -1。これが、スタックから値を取り出すときに常に最後の要素を見逃す理由です。最初の要素topを 0 にインクリメントします。

ああ、トムが言ったことを聞き逃しtopました。一番上の値を見つける前にデクリメントすると、間違った要素が返されます。以下の彼のコードが望ましいですが、これは初心者にとってより理解しやすいかもしれません:

public String pop() {
    String topValue = storage[top];
    top--;
    return topValue;
}
于 2012-02-29T02:20:22.603 に答える
1

top が -1 に初期化された 1 つの要素のみの場合push(String)、プッシュ後の top の値はどうなりますか?

次に、関数を見てください。要求された要素を取得しようとする前にpop()トップをデクリメントします。1 つの要素だけをプッシュした場合、どの配列インデックスにアクセスしようとしますか?

于 2012-02-29T02:20:26.847 に答える
1

-1から開始するためtop、String 配列から 5 つの要素を追加topすると 4 になります。これは、5 つの要素があるため正しくありません。

次に、スタックを 5 回ポップしようとすると、top-1 に戻り、storage[-1]存在しないため、ArrayIndexOutOfBoundsException

top0 から開始します。

または、スタックから要素を取得した後にデクリメントtopしても、エラーは発生しません。ただし、スタック内の要素の数を実際に表しているtopため、0 から開始することをお勧めします。top

于 2012-02-29T02:20:27.577 に答える
1

質問に宿題のタグを付けてください。そして問題になると、問題は pop() 関数にあります。最初に top の値を減らしてから、要素を返します。しかし、push() 関数を確認すると、最初にインクリメントしてから要素を追加しています。したがって、top--スタックから要素を取得した後に to を移動すると、問題は解決します。

于 2012-02-29T02:21:58.200 に答える
1

pop メソッドが正しくありません。ここのコードでは、top は負の 1 から始まります。

要素をプッシュすると、top は 0 になります。要素をポップすると、要素にアクセスする前に top は -1 になります。

また、空のメソッドが正しくありません。スタックの初期状態では、top = -1 であり、isEmpty は 0 を返すかどうかをチェックします。最初は、スタックは空である必要があります。

于 2012-02-29T02:23:02.360 に答える
1

pop() 関数を変更する必要があります。storage[pop] を一時変数に格納し、top を 1 減らしてから、一時変数を返す必要があります。

于 2012-02-29T02:23:03.660 に答える