java - 基于数组的堆栈实现?

标签 java data-structures 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. 对于基于堆栈的实现来说,数组实际上是一个好主意吗?我的使用场景是我将 10 个相当大的对象插入其中,所以我希望在弹出堆栈中的一个项目后能够释放内存。如何从数组中删除一个项目,我用 google 搜索了很多,但找不到任何好的东西。当我想从内存中清除它时,在这个地方使用链表会更好吗?

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

最佳答案

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

2) 数组(或ArrayList)就可以了。 Stack 是后进先出的数据结构,因此 ArrayList 或数组可以完美地工作 - 只需从数组中取出最后一项即可。 Java 不像 C 那样有“释放”内存的概念,垃圾收集器负责释放内存。一旦您完成了一个对象,您只需删除对其的引用 - 例如,如果您使用的是数组,则在执行 pop() 操作后,您将设置 array[lastIndex] = null;,然后垃圾收集器将处理其余的事情。

3)这是一个很好的做法,您可以具体说明类型信息。

关于java - 基于数组的堆栈实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16293405/

相关文章:

Netbeans 中的 Java 编码

java - 在 Java 中查找嵌套匹配的 HTML 标签

c++ - 用于插入数据的最快数据结构,而不是用于搜索

haskell - haskell中树上的最大元素?

list - 用于验证括号匹配的 Haskell 函数

java - 如何从堆栈中删除某些项目

java - 这段 Java XML 解析代码有什么问题?

java - 从数组到ArrayList

algorithm - 查找前一天、前一小时或前一分钟的前 k 个访问 URL?

python - 相同的逻辑适用于 c++,但不适用于 python 中的最大堆栈,我的代码中是否缺少某些东西