配列からのjavaスタックの読み取りは、a R R A Y Indexoutofboundsexceptionをスローします

StackOverflow https://stackoverflow.com/questions/9492667

質問

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

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

}

スタックメイン。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());

    }

}
役に立ちましたか?

解決

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

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

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

他のヒント

arrayStackのコンストラクタでは、-1ではなくtopを0に設定する必要があります。isEmptyメソッドでは、top == 0を参照してください。これが、スタックから値をオフにするときに、最後の要素を常に見逃している理由です。最初の要素を入れるtop == 0は0に増加します。

ああ、そして私は次のように言ったのかを逃しました。以下の彼のコードが望ましいが、これは初心者の理解がより簡単なかもしれません:

public String pop() {
    String topValue = storage[top];
    top--;
    return topValue;
}
.

push(String)が1つの要素だけで-1に初期化されている場合、PUSHの後の値の値は何でしょうか?

pop()関数を調べると、要求された要求が要求された要求が済みます。P>

あなたが始めてから top -1で、文字列配列から5つの要素を追加したら top あなたは5つの要素を持っているので、間違っている、4になります。

その後、スタックを5回ポップしようとすると, top -1に戻り、 storage[-1] あなたが得るので、存在しません ArrayIndexOutOfBoundsException

スタート top 0時

または、デクリメントした場合 top スタックから要素を取得した後は、エラーは発生しません;しかし、それは始める方が良いでしょう top 0であるため、 top スタック内の要素の数を実際に表しています。

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

あなたのPOPメソッドが正しくありません。ここのあなたのコードで、上位の否定的な1。

要素を押すと、上に0になります。 要素をポップすると、要素にアクセスする前に-1が-1になります。

また、空のメソッドが正しくありません。スタックの初期状態では、TOP= -1、およびISEMPTYが0が返されるかどうかを確認します。最初はスタックを空にする必要があります。

あなたのpop()関数を変更する必要があります。Storage [POP]を一時変数に保存してから、上位を1で減らす必要があり、一時変数を返します。

スタックを実装するためにJava 1.5ジェネリック機能を含めることができる場合、スタックがより柔軟になるでしょう。すべての種類のオブジェクトを保持することができます そして、もう1つのアドバイスはPOPメソッドにあります。(Genericsを使用している場合)以下に、効果的なJava Edition 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;
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top