public class ResizingArrayStack<Item> implements Iterable<Item> {
    private Item[] a =(Item[]) new Object[1];
    private int N=0;
    public  boolean isEmpty() { return N == 0; }
    public  int size() { return N;}
    private  void resize(int max){
        //将栈移动到一个大小为max的心数组
        Item[] temp = (Item[]) new Object[max];
        for (int i = 0; i < N; i++) {
            temp[i]=a[i];
        }
        a=temp;
    }
    public void  push(Item item){
        if (N == a.length) resize(2*a.length);
        a[N++] = item;
    }
    public Item pop(){
        Item item = a[--N];
        a[N] = null; //避免对象游离
        if(N>0 && N==a.length/4)  resize(a.length/2);
        return item;
    }
    public Iterator<Item> iterator()
    { return new ResizingArrayStack<>();}
    private class ReverseArrayIterator implements Iterator<Item>{
        //支持后进先出的迭代
        private  int i=N;
        public boolean hasNext(){ return i>0;}
        public  Item next() { return a[--i];}
        public  void remove() {}
    }
}

Java中的泛型,让我们只需要一份API和一次实现就能处理所有类型的数据。
由于数组不可轻易改变,我们通过栈的移动到另一数组,比较栈大小与数组长度调整栈大小即可。
被pop弹出的对象依然存在于数组中,java.gc无法识别,需要及时让它为null。
迭代器使用foreach处理时,我们无需改变任何用例代码就可以随意切换不同的表示方法,无需知晓类的实现细节用例也能使用迭代。
算法中:
* 每项操作的用时都与集中大小无关。*
* 空间需求总是不超过集合大小乘以一个常数。*