/**
* 栈
* 按照先进后出(FILO)的顺序获取数据。
*/
public class MyStack<E> {
protected Object[] elementData;// 元素集合
protected int capacityIncrement;// 当数组满后,增长的条数
private int elementCount;// 当前元素个数
public MyStack(int initialCapacity, int capacityIncrement) {
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
public MyStack(int initialCapacity) {
this(initialCapacity, 0);
}
public MyStack() {
this(10);
}
public E push(E element) {
int index = elementCount;
elementCount += 1;
int oldLen = elementData.length;
if (elementCount > oldLen) {
int newLength = oldLen
+ (capacityIncrement > 0 ? capacityIncrement : oldLen);
elementData = Arrays.copyOf(elementData, newLength);
}
elementData[index] = element;
return element;
}
public E peek() {
int len = size();
if (len == 0)
throw new RuntimeException("Stack is empty");
return elementAt(len-1);
}
public E pop() {
int len = size();
E element = peek();
elementCount -= 1;
elementData[len-1] = null;// GC
return element;
}
public E elementAt(int index){
if(index>=elementCount){
throw new IndexOutOfBoundsException(index + " >= " + elementCount);
}
return (E) elementData[index];
}
public int size() {
return elementCount;
}
}