public class LinkedStack<T> {
  private static class Node<U> {
  U item;
  Node<U> next;
  Node() { item=null; next=null; }
  Node(U item,Node<U> next) {
  this.item=item;
  this.next=next;
  }
  boolean end() { return item==null&&next==null; }
  }
  private Node<T> top=new Node<T>();  //末端哨兵
  public void push(T item) {
  top=new Node<T>(item,top);
  }
  public T pop() {
  T result=top.item;
  if(!top.end())
  top=top.next;
  return result;
  }
  public static void main(String args[]) {
  LinkedStack<String> lss=new LinkedStack<String>();
  for(String s: "Phasers on stun!".split(" "))
  lss.push(s);
  String s;
  while((s=lss.pop())!=null)
  System.out.println(s);
  }
}
/*
Output:
stun!
on
Phasers
*/
这个例子中使用了一个末端哨兵来判断堆栈何时为空。这个末端哨兵是在构造LinkedStack时创建的。然后,每 调用一次push()方法,就会创建一个Node<T>对象,并将其链接到前一个Node<T>对象。当你调用pop()方法时,总是返回top.item,然后丢弃当前top所指的Node<T>,并将top转移到下一个Node<T>,除非你已经碰到了末端 哨兵,这时候就不再移动top了。
-------------------------------------------
请解释这里的push(),pop()。
整段代码执行原理,谢谢。

解决方案 »

  1.   

    定义:s1=Phasers,s2=on,s3=stun;
    push的方法处理结果也就是lss,类似于map集合键值对形式,
    一步步这样嵌套的,最后的对象是lss也就是k3k1={s1,[item=null,next=null]}
    k2={s2,k1}
    k3={s3,k2}={
    s3,{s2,{s1,[item=null,next=null]}}
    }

    lss=k3;那么pop是逐步取值的,当然向上面述说的那样,最后的值s3是最后放进去的,也是第一个
    从pop这个方法中取出的,同时方法体内还叛断最后的top是否没空,空则执行结束
    这个类似于栈(stack)的原理吧,先进后出,后进先出的道理吧
    pop:result=(k3.item=s3)
        top = (k3.next=k2)
    最先输出的就是k3,然后k2,最后k1吧、
      

  2.   

    每次push都是把Node top放到顶部,并且建立top与next的联系;每次pop都是从顶部取Node,pop过程中利用top的next属性
      

  3.   

    就是典型的堆栈,先进后出。
    以item==null及next==null的节点为最底端的节点。
    top是最顶端的指针。