1

我是数据结构概念的新手,我创建了一个 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];    
}}

我一开始就使用数组作为后端存储。在真正全面实施之前,我有几个问题如下

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

  2. Array 对于基于 Stack 的实现来说实际上是一个好主意吗?我的使用场景是我将 10 个相当大的对象推入其中,因此我希望能够在弹出堆栈项后释放内存。如何删除数组中的项目,我用谷歌搜索了很多,但找不到任何好的东西。当我想从内存中清除它时,链接列表在这个地方会更好吗?

  3. 我在这里使用泛型,将 Array 与泛型一起使用是一种不好的做法吗?

4

2 回答 2

1

1)你不应该Exception因为“内存限制”而扔任何东西。只需构建一个更大的阵列。我建议使用一个ArrayList或其他东西来代替你。JVM会处理内存不足的情况,不要试图自己处理。如果您对内存使用施加硬性限制(例如“堆栈只能与初始容量一样大”),那么您可以根据需要创建自己的异常,例如StackFullException. 不过,我的建议是Stack不应该有大小限制。

2)数组(或ArrayList)很好。AStack是一个后进先出的数据结构,因此 ArrayList 或数组将完美运行 - 只需将最后一项从数组中拉出即可。Java 没有像 C 那样“释放”内存的概念,垃圾收集器处理释放内存。一旦你完成了一个对象,你只需摆脱对它的引用——例如,如果你正在使用一个数组,你将array[lastIndex] = null;在你完成一个pop()操作后设置,而垃圾收集器将处理其余的。

3)这是一种很好的做法,你对类型信息很具体。

于 2013-04-30T06:23:23.690 回答
0

抛出轻微的异常总是比异常本身好。关于使用数组很好,因为你可以拥有你想要的确切数量的元素,而且它也有利于低内存使用。对不起,我不知道关于基因阵列。 这可能会有所帮助

于 2013-04-30T06:27:31.850 回答