算法1.1 下压栈(LIFO)能动态调整数组的大小
代码实现如下:
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){
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*N);
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 ReserveArrayIterator();
}
private class ReserveArrayIterator implements Iterator<Item>{
private int i = N;
public boolean hasNext(){
return i > 0;
}
public Item next(){
return a[--i];
}
public void remove(){
}
}
}
优点:可以避免空间浪费,可以在不知道需要多大数组的前提下创建一个数组
注意这个栈实现了Iterable和Iteration接口,这可以方便使用foreach语法。如果想要一个集合数据类型可以迭代必须要实现一个iterator()方法并返回一个Iterator对象,还必须包含两个方法:hasNext()(返回一个布尔值)和next()(返回一个泛型元素)
Iterable对应的接口如下:
public interface Iterable<Item>
{
Iterator<Item> iterator();
}
需要在类中添加一个方法iterator(),如下:
public Iterator<Item> iterator(){
return new ReverseArrayIterator();
}
Iterator的接口如下:
public interface Iterator<Item>
{
boolean hasNext();
Item next();
void remove();
}
在栈数据类型里面拥有一个私有内部类,它实现了Iterator接口,并可以访问类的实例变量
注:Iterable接口在java.lang中,但是Iterator却在java.util中。