在我们的课堂上,我们制作两种不同的抽象数据类型,Double Stack
和Leaky Stack
。创建它们没有问题,但是我的教授为这两个ADT输入了作业详细信息,以“提供ADT的有效静态实现”。但是,这到底是什么意思?我明天可以问他,但是我想今天完成这项任务。有人知道他的意思是什么吗?
答案 0 :(得分:3)
一种可能的解释是,解决方案是使用固定大小的“静态”底层结构(例如数组),而不是使用动态增长量。因此,每个堆栈将具有预先分配的最大容量。因此,我希望在push(...)
操作上抛出一个异常,该异常会超出堆栈的容量(就像pop()
操作会抛出一个空堆栈一样)。
一个静态实现的示例(尽管它允许设置总容量),可能类似于以下示例。由于直接使用索引,因此访问将始终为O(1),没有数据结构的遍历,也没有内存重新分配。请注意,该代码是示例,尚未经过测试。如果所讨论的方法指定了特定的堆栈类型(例如int或char),则可以取消使用Generic。
public class AnotherStack<T>
{
private final T[] values;
private int loc = 0;
// must use the suppress, as we are using a raw Object array
// which is necessitated as cannot make a generic array
// See Effective Java
@SuppressWarnings("unchecked")
public AnotherStack(int size)
{
values = (T[])new Object[size];
}
public void push(T val)
{
if (loc < values.length) {
values[loc++] = val;
}
else {
throw new IllegalStateException("Stack full");
}
}
public T pop()
{
if (loc == 0) {
throw new IllegalStateException("Stack empty");
}
return (values[--loc]);
}
// other methods
}