基于数组的堆栈实现?

时间:2013-04-30 06:16:13

标签: java data-structures stack

我是数据结构概念的新手,我已经为自己的用法创建了一个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作为后端存储。在实际完全实现它之前,我在下面有几个问题

  1. 使用throw new Exception是一个好主意,或者我应该为此编写自己的异常类,考虑到堆栈是内存有限的情况。

  2. 对于基于堆栈的实现,Array实际上是一个好主意,我的使用场景是我将10个相当大的对象推入其中,所以我希望能够在弹出堆栈项目后释放内存。如何从数组中删除一个项目,我用Google搜索但找不到任何好处。当我想从内存中清除它时,链接列表会更好。

  3. 我在这里使用泛型,使用Array和Generics是不好的做法?

2 个答案:

答案 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