ResizingArrayStack
关于迭代器
Iterable 是JDK源码,可以通过成员内部类,方法内部类,匿名内部类实现Iterator。
public interface Iterable<Item>//对应接口(java.lang.Iterable)
{
Iterator <Item> iterator();
}
Iterator是一个实现了hasNext()和Next()方法的类的对象,接口定义如下
public interface Iterator<Item>//对应接口(java.util.Iterator)
{
boolean has next();
Item next();
void remove();
}
代码实现
package chapter1.a3;
//下压栈,动态调整数组大小的实现
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
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)
{
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[--N]; }
public void remove() { }
}
public static void main(String[] args)
{
FixedCapacityStack<String> s;
s = new FixedCapacityStack<String>(100);
while (!StdIn.isEmpty()) {
String item = StdIn.readString();
if (!item.equals("-"))
s.push(item);
else if (!s.isEmpty()) StdOut.print(s.pop() + " ");
}
StdOut.println("(" + s.size() + " left on stack)");
for (String i: s)
{
StdOut.println(i);
}
}
}