创建固定大小的堆栈

koo*_*ng3 22 java stack

我想用Java创建一个Stack,但是要修改它的大小.例如,创建一个新的Stack,将大小设置为10,然后当我将项目推送到堆栈时它会填满,当它填充到10时,堆栈中的最后一个项目被推下(删除).我想使用Stack,因为它使用LIFO并且非常符合我的需求.

但是Stack从Vector继承的setSize()方法似乎并没有实际限制Stack的大小.我想我错过了一些关于Stacks如何工作的东西,或者Stacks并不意味着受到限制所以这是不可能的.请教育我!

Cal*_*vin 24

这是一种SizedStack扩展的类型Stack:

import java.util.Stack;

public class SizedStack<T> extends Stack<T> {
    private int maxSize;

    public SizedStack(int size) {
        super();
        this.maxSize = size;
    }

    @Override
    public T push(T object) {
        //If the stack is too big, remove elements until it's the right size.
        while (this.size() >= maxSize) {
            this.remove(0);
        }
        return super.push(object);
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:Stack<Double> mySizedStack = new SizedStack<Double>(10);.除了尺寸,它的运作方式与其他任何一样Stack.

  • 我将其更改为`while(this.size()&gt; = maxSize)`,以解决您注意到的一一错误。谢谢。为了安全起见,它仍然应该是一个while循环;如果大小以某种方式大于maxSize会发生什么?我知道这似乎是不可能的,但是bug是bug :)。 (2认同)
  • 我喜欢支持您选择的体贴!很好的电话:D (2认同)
  • 这是一个很好的答案,但是值得一提的是,建议使用Deque接口的实现,而不要使用不是很线程安全且基于另一个过时的类(如Vector)的(非常旧的)Stack。 (2认同)

Mar*_*aux 5

您可以创建一个非常简单的堆栈,如下所示:

public class FixedStack<T>
{
    private T[] stack;
    private int size;
    private int top;

    public FixedStack<T>(int size)
    {
        this.stack = (T[]) new Object[size];
        this.top = -1;
        this.size = size;
    }

    public void push(T obj)
    {
        if (top >= size)
            throw new IndexOutOfBoundsException("Stack size = " + size);
        stack[++top] = obj;
    }

    public T pop()
    {
        if (top < 0) throw new IndexOutOfBoundsException();
        T obj = stack[top--];
        stack[top + 1] = null;
        return obj;
    }

    public int size()
    {
        return size;
    }

    public int elements()
    {
        return top + 1;
    }
}
Run Code Online (Sandbox Code Playgroud)