Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有元素限制的Java堆栈_Java_List_Stack - Fatal编程技术网

具有元素限制的Java堆栈

具有元素限制的Java堆栈,java,list,stack,Java,List,Stack,我知道这个问题已经问了很多次了,但经过一个小时的研究,我仍然有问题 我想使用一个后进先出堆栈,它有一个最大数量的元素可以存储。当它达到最大数量是删除元素在第一个地方,并替换为新的,所以在第一次弹出我可以得到这个元素,在第二次我必须得到元素的大小为1 我尝试的是: 1使用修改后的堆栈,如前所述。问题是,如果添加的大小为5,它总是返回前5个元素 class StackSizable<E> extends Stack<E>{ int maxSize; Stac

我知道这个问题已经问了很多次了,但经过一个小时的研究,我仍然有问题

我想使用一个后进先出堆栈,它有一个最大数量的元素可以存储。当它达到最大数量是删除元素在第一个地方,并替换为新的,所以在第一次弹出我可以得到这个元素,在第二次我必须得到元素的大小为1

我尝试的是:

1使用修改后的堆栈,如前所述。问题是,如果添加的大小为5,它总是返回前5个元素

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);