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处理时,我们无需改变任何用例代码就可以随意切换不同的表示方法,无需知晓类的实现细节用例也能使用迭代。
算法中:
* 每项操作的用时都与集中大小无关。*
* 空间需求总是不超过集合大小乘以一个常数。*