Thinking in Java 泛型章节中不用LinkedList来实现自己的内部链式存储机制

    这是一个传统的下推堆栈,没有用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引用就一直指向栈顶元素。

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

posted @ 2014-03-29 13:04  桑葚先生  阅读(498)  评论(0编辑  收藏  举报