繁体   English   中英

Java Stack的元素限制

[英]Java Stack with elements limit

我知道这个问题已经问了很多遍了,但是经过一个小时的搜索,我仍然有问题。

我想使用一个lifo堆栈,它可以存储的元素数量最多。达到最大数量后,首先删除该元素并将其替换为新元素,因此在第一个弹出窗口中我可以获取此元素,第二个我可以必须将元素的大小设为1。

我试过的

1)使用修改的堆栈,如所描述这里 。问题是,它总是返回第一5个元素(如果5)1加入的大小。

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 )使用ArrayDeque,我没有看到与简单Stack的任何区别,它没有设置任何限制(我使用错了吗?)

ArrayDeque<State> lifo = new ArrayDeque<State>(5);
lifo.pop();
lifo.push(state);

我想在益智游戏中使用此功能以实现撤消重做功能

解决:我结束了使用tom所说的固定大小堆栈,主要是为了提高性能

public class FixedStack<T> { private T[] stack; private int size; private int top; private int popBalance = 0;//its used to see if all the elements have been popped public FixedStack(T[] stack) { this.stack = stack; this.top = 0; this.size = stack.length; } public void push(T obj) { if (top == stack.length)top = 0; stack[top] = obj; top++; if (popBalance < size - 1)popBalance++; } public T pop() { if (top - 1 < 0)top = size; top--; T ob = stack[top]; popBalance--; return ob; } public void clear() { top = 0; } public int size() { return size; } public boolean poppedAll() { if (popBalance == -1)return true; return false; } }

我认为最有效的方法是使用固定数组,其大小等于元素的最大数量,并使用一个索引指向当前是队列“顶部”的元素。

添加新元素时,将其添加到索引+1(如有必要,请换回元素0),并可能覆盖不再适合的元素。 当您弹出一个元素时,您要进行相反的操作。

这样,您的数据结构就不必重新排序,并且可以使用比集合轻的数组。

当达到最大大小时,您的行

this.removeElementAt(this.size() - 1);

然后立即删除最后推送的元素(您刚刚推送的元素),它是堆栈的顶部。 您需要删除第一个元素(堆栈底部):

this.removeElementAt(0);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM