Java传统的下的堆栈是用LinkedList实现的,LinkedList本身已经具备了创建堆栈所必需的方法,而Stack可以通过两个泛型的类Stack和LinkedList的组合来创建。现在我不使用LinkedList,使用泛型来实现自己的内部链式存储机制。
public class LinkedStack{
private static class Node{
U item;
Node() { item = null;next = null; }
Node (U item, Node next){
this.item = item;
this.next = next;
}
boolean end(){ return item == null && next == null; }
}
private Node top = new Node();
public void push(T item){
top = new Node(item, top);
}
public T pop(){
T result = top.item;
if(!top.end())
top = top.next;
return result;
}
public static void main(String[] args){
LinkedStack lss = new LinkedStack();
for(String s : "Phasers or stun!".split(" "))
lss.push(s);
String s;
while((s = lss.pop() != null))
System.out.println(s);
}
}
/*Output
stun!
on
Phasers
*/
内部类Node也是一个泛型,它拥有自己的类型参数。这里使用了一个末端哨兵来判断堆栈何时为空。这个末端哨兵是在构造LinkedList时创建的。然后,每调用一次push()方法,就会创建一个Node对象,并将其链接到前一个Node对象。当你调用pop()方法时,总是返回top.item,然后丢弃当前top所指的Node,并将top转移到下一个Node,除非已经碰到了末端哨兵,这时候就不再移动top了。如果已经到了末端,客户端程序还继续调用pop()方法,它只能得到null ,说明堆栈已经空了。