3

これは、Joshua Bloch による、Effective Java 2nd edition の Item 6、pg 24、第 2 章のコードです。彼が定義する pop メソッドでは、 を使用しelements[--size]ます。なぜ彼が を使用したのか疑問に思っていますが--size、代わりelements[size--]に同じ正しいを返す必要がありますか?

public class Stack {
       private Object[] elements;
       private int size = 0;
       private static final int DEFAULT_INITIAL_CAPACITY = 16;
       public Stack() {
           elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
       public void push(Object e) {
           ensureCapacity();
           elements[size++] = e;
}
       public Object pop() {
           if (size == 0)
               throw new EmptyStackException();
           return elements[--size];
}
       /**
        * Ensure space for at least one more element, roughly
        * doubling the capacity each time the array needs to grow.
        */
       private void ensureCapacity() {
           if (elements.length == size)
               elements = Arrays.copyOf(elements, 2 * size + 1);
} }
4

2 に答える 2

11

配列は 0 ベースのインデックスであるためです。

2 つの要素を持つスタックがあるとします。

したがって、スタックのサイズは 2 に等しく、配列に次の表現があります。

elements[0] = elem;
elements[1] = elem;

したがって、スタックから elem をポップする前にサイズを小さくする必要があります。そうelements[2]しないと、存在しない pop を試みることになります。したがって、この場合は中置演算子が使用されます。

return elements[--size];

と同等です

size--;
return elements[size];

elements[size--];書き込まれると、ポップelements[2]してからサイズを 1 減らします。そのためArrayIndexOutOfBoundsException、スタックから要素をポップするたびに がスローされます。

于 2013-09-27T18:42:02.490 に答える
-1

簡単な答えは、マイナス-マイナス (またはプラス プラス) は、変数の前にある場合は反復前に機能し、変数の後にある場合は反復後に機能します。

例えば:

for(x=0; x<3; x++) {
    System.out.print(x);
}

戻り値:

012

その間:

for(x=0; x<3; ++x) {
    System.out.print(x);
}

戻り値:

123

x 変数は反復の前にインクリメントされるためです。

于 2013-09-27T18:49:24.217 に答える