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



京公网安备 11010502036488号