import java.util.Iterator;
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 ReverseArrayIterator();
}
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() {}
}
}
该代码实现了一份泛型可迭代的栈的API,它将所有元素保存在一个数组中,并动态调整数组大小以保持数组大小和栈的大小之比小于一个常数(在这里是 12\frac{1}{2}21)