Efficient Array Based Drop out Stack
public class DropOutStack implements Stack { private static final int DEFAULT_CAPACITY = 10; private final T[] elements; private int top; private int count; public DropOutStack() { this(DEFAULT_CAPACITY); } @SuppressWarnings("unchecked") public DropOutStack(final int size) { assert size > 0; this.elements = ((T[]) new Object[size]); this.top = 0; this.count = 0; } public final void push(final T element) { this.elements[top] = element; this.top = (this.top + 1) % this.elements.length; if (this.count != this.elements.length) { this.count++; } } public final T pop() { if (isEmpty()) { throw new CollectionEmptyException(); } this.top = (this.top + this.elements.length - 1) % this.elements.length; T result = this.elements[this.top]; this.elements[this.top] = null; this.count--; return result; } public final int size() { return this.count; } public final T peek() { return this.elements[this.top - 1]; } public final boolean isEmpty() { return this.count == 0; } }