【问题标题】:Java Stack with elements limit具有元素限制的 Java 堆栈
【发布时间】:2013-04-05 17:58:10
【问题描述】:

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

我想使用一个 lifo 堆栈,它可以存储最大数量的元素。达到最大数量后,首先删除元素并将其替换为新元素,因此在第一次弹出时我可以获得这个元素和在第二个中,我必须获得 size-1 的元素。

我尝试了什么:

1) 使用修改后的 Stack ,如 here 所述。问题是它总是返回我添加的前 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)使用 ArrayDeque ,我看不出与简单 Stack 有任何区别,它没有设置任何限制(我用错了吗?)

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

我想在益智游戏中使用它来实现撤销-重做功能

已解决:我最终使用了一个固定大小的堆栈,正如汤姆所说,主要是为了性能

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

【问题讨论】:

标签: java list stack


【解决方案1】:

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

当你添加一个新元素时,你在 index+1 处添加它(必要时返回到元素 0)并可能覆盖不再适合的元素。当你弹出一个元素时,你会做相反的事情。

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

【讨论】:

    【解决方案2】:

    当达到最大尺寸时,你的行

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

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

    this.removeElementAt(0);
    

    【讨论】:

    • 是的,你是对的,这是我改变它的问题,它工作正常,但我会选择汤姆的回答,主要是为了性能。
    • 没关系,@Tom 的答案会表现得更好,更好的答案也是如此。
    猜你喜欢
    • 2010-10-28
    • 2011-02-16
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2015-03-26
    相关资源
    最近更新 更多