我是数据结构概念的新手,我已经为自己的用法创建了一个Stack。
public class ArrayBasedStackImpl<T> {
@SuppressWarnings("unchecked")
private T[] DataStack= (T[]) new Object[10];
private int stack_pointer=-1;
public void push(T t) throws Exception
{
if(stack_pointer>9)
{
throw new Exception("Stack is full");
}
DataStack[++stack_pointer]=t;
}
public T pop() throws Exception
{
if(stack_pointer==-1)
{
throw new Exception("Stack Empty");
}
else
{
return DataStack[stack_pointer--];
}
}
public T peek()
{
return DataStack[stack_pointer];
}}
我已经开始使用Array作为后端存储。在实际完全实现它之前,我在下面有几个问题
使用throw new Exception是一个好主意,或者我应该为此编写自己的异常类,考虑到堆栈是内存有限的情况。
对于基于堆栈的实现,Array实际上是一个好主意,我的使用场景是我将10个相当大的对象推入其中,所以我希望能够在弹出堆栈项目后释放内存。如何从数组中删除一个项目,我用Google搜索但找不到任何好处。当我想从内存中清除它时,链接列表会更好。
我在这里使用泛型,使用Array和Generics是不好的做法?
答案 0 :(得分:1)
1)你不应该因为“内存限制”而抛出任何Exception
。只需构建一个更大的阵列。我建议使用ArrayList
或其他类似的东西。 JVM将处理内存不足的情况,不要尝试自己处理它。如果您对内存使用量施加了硬性限制(例如“堆栈只能与初始容量一样大”),那么您可以根据需要创建自己的例外,例如StackFullException
。但我的建议是,Stack
不应该有大小限制。
2)数组(或ArrayList
)没问题。 Stack
是后进先出数据结构,因此ArrayList或数组将完美地工作 - 只需将最后一项从数组中拉出即可。 Java没有像C那样的“免费”内存概念,垃圾收集器处理释放内存。一旦你完成了一个Object,你就可以删除对它的引用 - 例如,如果你使用的是数组,那么在你进行array[lastIndex] = null;
操作后就可以设置pop()
,垃圾收集器会处理剩下的事情。
3)这是一种很好的做法,你对类型信息有所了解。
答案 1 :(得分:0)
抛出异常比异常本身更好。关于使用Array是好的,因为你可以拥有你想要的确切数量的元素,这对于低内存使用也是一个优势。我不喜欢关于genic数组的想法。 This might help