【发布时间】:2014-03-14 13:54:51
【问题描述】:
我在大学的老师教过我们这种堆栈的实现。但是这个是完全递归的,我在网络上的任何地方都没有看到过这样的东西。所以我想知道这有多好或多有效。正如我所看到的,使用链表(是最有效的一种)和使用数组的堆栈实现很多。
public class Stack<T>
{
private T top;
private Stack<T> base;
public Stack(){
top = null;
base = null;
}
public Stack(T data, Stack<T> base){
top = data;
this.base = base;
}
public boolean isEmpty(){
return top == null;
}
public T top(){
return top;
}
public T push(T data){
if (isEmpty()){
top = data;
base = new Stack<T>();
} else {
base = new Stack<T>(top, base);
top = data;
}
return data;
}
public T pop(){
T res = null;
if (!isEmpty()){
res = top;
top = base.top;
base = base.base;
}
return res;
}
}
我想听听您的意见,因为我真的在其他任何地方都没有见过这种实现方式。请随意解释复杂性!
【问题讨论】:
-
递归在哪里?
-
所以它是一个基于链表而不是数组的堆栈。这意味着推送和弹出的 O(1) - 您不必担心数组的增长。随机访问将是 O(n),但这通常不是使用堆栈的方式。
-
所有操作都是 O(1)。看不出这个实现有什么问题。
-
@rendon:这是一种递归数据结构,与递归函数调用相反。它是一个堆栈(节点),带有指向另一个堆栈的指针。
-
@FraK:这是一个链表实现。看:最上面的节点有对下一个的引用,它有对下一个的引用,等等。这就是链表。