配列からのjavaスタックの読み取りは、a R R A Y Indexoutofboundsexceptionをスローします
-
14-11-2019 - |
質問
配列からスタックを埋めてから、要素を順番に印刷してから、順序を逆にする必要があります。私が問題を抱えているのは、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;
}
.