具有元素限制的Java堆栈
我知道这个问题已经问了很多次了,但经过一个小时的研究,我仍然有问题 我想使用一个后进先出堆栈,它有一个最大数量的元素可以存储。当它达到最大数量是删除元素在第一个地方,并替换为新的,所以在第一次弹出我可以得到这个元素,在第二次我必须得到元素的大小为1 我尝试的是: 1使用修改后的堆栈,如前所述。问题是,如果添加的大小为5,它总是返回前5个元素具有元素限制的Java堆栈,java,list,stack,Java,List,Stack,我知道这个问题已经问了很多次了,但经过一个小时的研究,我仍然有问题 我想使用一个后进先出堆栈,它有一个最大数量的元素可以存储。当它达到最大数量是删除元素在第一个地方,并替换为新的,所以在第一次弹出我可以得到这个元素,在第二次我必须得到元素的大小为1 我尝试的是: 1使用修改后的堆栈,如前所述。问题是,如果添加的大小为5,它总是返回前5个元素 class StackSizable<E> extends Stack<E>{ int maxSize; Stac
class StackSizable<E> extends Stack<E>{
int maxSize;
StackSizable(int size)
{
super();
this.maxSize=size;
}
@Override
public E push(E elt) {
super.push(elt);
while (this.size() > this.maxSize) {
this.removeElementAt(this.size() - 1);
}
return null;
}
}
2使用ArrayDesk,我看不出与简单堆栈有任何区别,它没有设置任何限制。我使用它是否错误
ArrayDeque<State> lifo = new ArrayDeque<State>(5);
lifo.pop();
lifo.push(state);
我想在一个益智游戏中使用它的撤销重做功能
解决方法:正如tom所说,我结束了使用固定大小的堆栈,主要是为了性能
当达到最大尺寸时,您的线路
this.removeElementAt(this.size() - 1);
然后立即删除刚才推送的最后一个元素,即堆栈的顶部。您需要删除第一个元素,而不是堆栈的底部:
this.removeElementAt(0);
我认为最有效的方法是使用一个固定数组,其大小等于元素的最大值,并使用一个指向当前处于队列“顶部”的元素的索引 当您添加新元素时,您可以在索引+1处添加它,必要时将其换回元素0,并可能覆盖不再适合的元素。当您弹出一个元素时,您会执行相反的操作
这样,您的数据结构就不必重新排序,您可以使用比集合更轻的数组。请看:@JerryAndrews,但他希望在第一个元素达到容量时删除它,所以我认为是这样的,是的,你是对的,这就是问题所在。我改变了它,它工作正常,但我将主要为了表现而使用tom的答案。那很好,@tom的答案会表现更好,更好的答案也是如此。
this.removeElementAt(0);