栈里需要放不同的数据类型,所以需要实现泛型。
Stack 类支持迭代器,需要实现两个接口。
- Stack 整个类作为 Iterable 接口的实现
- Stack 类的 iterator() 方法返回一个迭代器,这个迭代器作为 Iterator 接口的实现。
import java.util.Iterator;
public class Stack<Item> implements Iterable<Item>
{
public Iterator<Item> iterator()
{
return new ListIterator();
}
private class ListIterator implements Iterator<Item>
{
private Node current = first;
public boolean hasNext() { return current != null; }
public Item next()
{
Item item = current.item;
current = current.next;
return item;
}
}
private class Node
{
Item item;
Node next;
}
private Node first = null;
public boolean isEmpty()
{ return first == null; }
public void push(Item item)
{
Node oldfirst = first;
first = new Node();
first.item = item;
first.next = oldfirst;
}
public Item pop()
{
Item item = first.item;
first = first.next;
return item;
}
public static void main(String[] argv)
{
Stack<String> stringStack = new Stack<String>();
stringStack.push("huangyi");
stringStack.push("jiahai");
System.out.println(stringStack.pop());
Stack<Integer> intStack = new Stack<Integer>();
intStack.push(22);
intStack.push(33);
intStack.push(44);
intStack.push(55);
Iterator<Integer> iter = intStack.iterator();
while (iter.hasNext())
{
Integer num = iter.next();
System.out.println(num);
}
}
}
其中的迭代器遍历可以替换为这种简单的语法
for(Integer i: intStack)
System.out.println(i);
另外,C++11 也兹此这种写法,参见 c++11-ranged-for-loop, C++ 也是如此优雅。
参考
https://class.coursera.org/algs4partI-010/lecture/21
http://www.cprogramming.com/c++11/c++11-ranged-for-loop.html