这是一个传统的下推堆栈,没有用LinkedList来实现内部链式存储机制。在阅读代码的时候可以参考以前学过的用c语言的指针(以对象的引用来类比于指针)来完成链式堆栈的建立过程会很有帮助。下面就是这个链式堆栈的实现过程。
1 //:generics/LinkedStack.java 2 //A Stack implemented with an internal linked structure. 3 4 public class LinkedStack<T>{ 5 //一个静态的内部类 6 private static class Node<U>{ 7 U item; 8 Node<U> next; 9 Node(){item=null;next=null;} 10 Node(U item,Node<U> next){ 11 this.item=item; 12 this.next=next; 13 } 14 boolean end(){return item==null&next==null} 15 } 16 private Nede<T> top=new Node<T>(); 17 public void push(T item){ 18 top=new Node<T>(item,top); 19 } 20 21 public T pop(){ 22 T result=top.item; 23 if(!top.end()) 24 top=top.next; 25 return result; 26 } 27 28 public static void main(String[] args){ 29 LinkedStack<String> lss=new LinkedStack<String>(); 30 for(String s :"phasers on stun!".split(" ")); 31 lss.push(s); 32 String s; 33 while((s=lss.pop())!=null) 34 System.Out.println(s); 35 } 36 } 37 /* Output: 38 stun! 39 on 40 phasers 41 42 *//
关于这段代码书上是这样描述的:内部类Node也是一个泛型,他拥有自己的类型参数。这个例子使用了一个末端哨兵(end sentinel)来判断堆栈何时为空。这个末端哨兵是在构造LinkedStack是创建的。然后,每调用一次push()方法,就会创建一个Node<T>对象,并将其链接到前一个Node<T>对象上面。当调用pop()方法的时候,总是返回top.item,然后丢弃当前top所指的Node<T>,并将top转移到下一个Node<T>,除非遇到了末端哨兵,这时候就不在移动top了。
我的理解:top只有在LinkedStack<T>对象被实例化的时候才指向一个空的对象(这里指的是其中的item和next均为null)。
而后在第一次进行push()操作的时候,一个 Node<T>(item,top)对象被放到了原来的top指向的地方(确切的说是top指向了它)。其中item指的是本次被push进去的对象,而next引用指向原本top所指向的对象。这就相当于实现了一个链式结构。所以在第一次push之后,top引用就一直指向栈顶元素。
Thinking in Java 泛型章节中不用LinkedList来实现自己的内部链式存储机制,布布扣,bubuko.com