实现链式存储机制
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是最顶端的指针。