日期:2014-05-20  浏览次数:20826 次

实现链式存储机制
Java code
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()。
整段代码执行原理,谢谢。

------解决方案--------------------
你写的代码相信你最清楚了
------解决方案--------------------
定义:s1=Phasers,s2=on,s3=stun;
push的方法处理结果也就是lss,类似于map集合键值对形式,
一步步这样嵌套的,最后的对象是lss也就是k3

k1={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吧、
------解决方案--------------------
执行原理?你自己不懂?那你怎么写出来的呢
------解决方案--------------------
每次push都是把Node top放到顶部,并且建立top与next的联系;每次pop都是从顶部取Node,pop过程中利用top的next属性
------解决方案--------------------
就是典型的堆栈,先进后出。
以item==null及next==null的节点为最底端的节点。
top是最顶端的指针。