- 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!onPhasers*/
这个例子中使用了一个末端哨兵来判断堆栈何时为空。这个末端哨兵是在构造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是最顶端的指针。