2012-02-29 1 views
1

配列からスタックを塗りつぶし、要素を順番に印刷してから、順序を逆にする必要があります。私が問題を抱えているのは、ArrayIndexOutOfBoundsExceptionが発生し、どこから来ているのかわからないということです。私はデバッグを実行しようとしていると、それは最後の要素に到達しない要素を飛び出しているように見えます。以下は私のコードです:配列から読み込んだjavaスタックが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:pop()

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()); 

    } 

} 

答えて

3

、あなたはtopの古い値のインデックスにある項目であるポップされたアイテムを、返却する必要があります。クリーンな方法は

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

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

+0

に言及した、より柔軟なスタックの実装では、私はすべての午後のために戦ってきた単純な答えだったこと、ありがとうございました。 – user519670

1

arrayStackのコンストラクタでは、topを-1ではなく0に設定する必要があります。 isEmptyメソッドでは、top == 0を確認することさえあるので、top == 0は、top == -1ではなく空であることを意味します。これは、スタックから値をポップする際に、最後の要素が常に不足しているためです。最初の要素を置くと、topは0になります。

ああ、私はtomが言ったことを逃しました:topをデクリメントすると、上の値が間違った要素を返します。下の彼のコード好適であるが、これは初心者のために理解し、より使いやすいかもしれません:あなたpush(String)ただ一つの要素場合

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

ありがとうございました – user519670

1

、-1に初期化し、トップで、トップの値がプッシュした後、何でしょうか?

今すぐあなたのpop()機能を見て、それは要素が要求された取得しようとして前にトップをデクリメントし、それはあなただけで一つの要素をプッシュした場合にアクセスしようとするためにどのような配列のインデックスを起こっていますか?

1

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

次にあなたがスタックを5回ポップしようとすると、topがバックになっ-1とstorage[-1]はあなたがtopをデクリメント場合は、代わりに0

ArrayIndexOutOfBoundsException

スタートtopを取得するので、存在しません。スタックから要素を取得した後は、エラーは発生しません。 topは本当にスタックの要素の数を表しているので、0からtopを開始する方が良いでしょう。

+0

ありがとうございました! – user519670

1

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

1

あなたのpopメソッドは正しくありません。ここでコード内では、先頭が負で始まります。

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

また、空の方法が間違っています。スタックの初期状態では、top = -1であり、isEmptyは、それが0を返すかどうかをチェックします。最初は、スタックは空でなければなりません。

1

pop()関数を変更する必要があります。あなたは、あなたのスタックがより柔軟になりますstack.Thenを実装するには、Java 1.5ジェネリック施設を含めることができる場合、それは素晴らしいことだ一時変数に[ポップ]ストレージを格納し、1でトップを削減して、一時的な変数

1

を返す必要があります.Itは任意のタイプのオブジェクトを保持することができます(あなたの場合は文字列のみ) もう1つのアドバイスはpopメソッドにあります。ガベージコレクタに次のようにポップされたオブジェクトを破棄するよう指示します。続いて(あなたがジェネリックを使用している場合場合は)効果的な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; 
} 
関連する問題