【发布时间】:2014-02-26 11:41:48
【问题描述】:
首先,如果这是一个非常明显的问题,或者我没有正确看待它,我深表歉意。 我被指示“将堆栈扩展为动态”。我已获得有关如何执行此操作的具体说明,即:
创建一个两倍于当前数组大小的新数组 tmp
将当前数组中的所有元素(讲义中称为 S)复制到 tmp 中
设置 S = tmp;
应该执行此操作的代码块将被放入 push() 方法中,替换异常抛出部分。
问题是,我不知道我应该使用什么样的数组(泛型是最近才介绍给我的,我并没有像我想的那样理解它们)。 有什么明显的我遗漏了,还是我没有正确理解这一点?
这段代码的大部分不是我写的,只有 pop()、push() 和 top() 方法。
public class ArrayStack<E> implements Stack<E> {
private E[] S;
private int top;
private int capacity;
private static int DEFAULT_SIZE = 100;
public ArrayStack(int size){
capacity = size;
S = (E[]) new Object[size];
top = -1;
}
public ArrayStack(){
this(DEFAULT_SIZE);
}
public E pop() throws StackException{
if(isEmpty())
throw new StackException("stack is empty");
return S[top--];
}
public void push(E e) throws StackException{
if (size() == capacity)
throw new StackException("Stack is full");
S[++top] = e;
}
public E top() throws StackException{
if(isEmpty())
throw new StackException("Stack is empty");
return S[top];
}
【问题讨论】:
-
在这种情况下,“动态”是什么意思?这是否意味着允许底层数组在满/需要时扩展大小?
-
我认为基本上我被要求做的是每当有东西被压入堆栈时将底层数组的大小加倍,然后将当前数组的内容转移到新数组中 -这是一个可怕的解决方案,但我只是 Java 的初学者。
-
这不是一个糟糕的解决方案——它是大多数有序数据结构的工作方式。当内部数组已满时,它会扩展一定的因子(双倍也可以),然后将旧数据复制到新数组中。
-
哦,我只是认为这不是一个好方法,因为(据我的理解)每次将某些东西压入堆栈时,都会为数组分配两倍的内存。谢谢!
标签: java arrays generics stack