废话不多说,先上代码
public class Test {
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);
}
}
}
class LinkedStack<T> {
private static class Node<U> {
U item;
Node<U> next;
Node() {
this.item = null;
this.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;
}
}
程序经测试可以正常运行,这里采用链表来进行数据的传输,不过比较疑惑的一点是关于遍历的pop方法,哪里判断top不为空的时候指向下一个元素,但是我比较疑惑的是top默认指向的是链表尾端的next,之前的next应该已经覆盖掉了啊,为啥能找得到之前的nex节点呢?而且看一些教程上的便利都是从头节点遍历的,,,为什么能找到之前的next节点?求解惑,感激不尽
3 回答
忽然笑
TA贡献1806条经验 获得超5个赞
链表只是形式上的链表,什么是形式的链表,是这种数据结构用链表的方式表达是最容易表达出来的。我们先看main主函数走。首先就是拿字符串循环字符一个一个通过push方法进去。然后定义字符串s,通过pop方法把下一个节点的值取出来赋值给s,判空循环取值。主函数大致我读下来就是这样。我们来看Node,首先无参构造先构造空节点,两个参数的构造器的一个参数是指向节点本身,一个指向下一个节点。end方法就是如果当前节点和下一个节点为空时return true,push就不用说了,通过两个参数的构造器赋值,pop就是循环遍历吧,总体就是这样,为什么能够找到next是因为每一个节点的next节点都赋值了。还有为什么拿出来的时候直接指向尾部,U item是指向当前节点,比如你把字符"segmentfault"一个一个字符存进去的时候,存完的时候你的对象你注意看,最后的你的位置,是在t这个字符上的。以上是我的理解哈,数据结构我也挺菜的,不知道说的对不对
添加回答
举报
0/150
提交
取消