我可以限制通用堆栈的深度吗?

Fly*_*wat 6 c# generics stack

是否有内置的方法来限制System.Collection.Generics.Stack的深度?因此,如果您处于最大容量,推送新元素将删除堆栈的底部?

我知道我可以通过转换为数组并重建堆栈来实现它,但我认为可能已经有了一个方法.

编辑:我写了一个扩展方法:

    public static void Trim<T> (this Stack<T> stack, int trimCount) 
    {
        if (stack.Count <= trimCount)
            return;

       stack = new 
            Stack<T>
            (
                stack
                    .ToArray()
                    .Take(trimCount)
            );           
    }
Run Code Online (Sandbox Code Playgroud)

因此,它在修剪时返回一个新的堆栈,但不是不可变的功能方式=)

这样做的原因是我在堆栈中存储应用程序的撤消步骤,我只想存储有限数量的步骤.

Gre*_*ean 17

您正在寻找的是一个辍学堆栈.AFAIK,BCL不包含一个,尽管它们很容易实现.通常,撤消和重做功能依赖于此类数据结构.

它们基本上是一个数组,当你推入堆栈时,堆栈的"顶部"会在数组周围移动.最终,当堆栈已满并且替换堆栈的"底部"时,顶部将回绕到开头.

谷歌没有提供太多信息.这是我能找到的最好的:

(警告PDF) http://courses.cs.vt.edu/~cs2704/spring04/projects/DropOutStack.pdf

这里有一些锅炉板代码,可以帮助您入门.我会让你填写其余的(完整性检查,计数,索引器等)

class DropOutStack<T>
{
    private T[] items;
    private int top = 0;
    public DropOutStack(int capacity)
    { 
        items = new T[capacity];
    }

    public void Push(T item)
    {
        items[top] = item;
        top = (top + 1) % items.Length;
    }
    public T Pop()
    {
        top = (items.Length + top - 1) % items.Length;
        return items[top];
    }
}
Run Code Online (Sandbox Code Playgroud)


Rya*_*ndy 2

我看不到办法。您可以继承Stack<T>,但似乎没有任何有用的内容可以覆盖。

最简单(如果有点乏味)的方法是用Stack<T>你自己的方式包装,比如说,LimitedStack<T> . 然后实现您想要的方法并传递到内部Stack<T>,同时在Push方法中以及您需要的其他地方包含您的限制逻辑。

编写所有这些传递成员是很痛苦的,特别是如果您要实现与Stack<T>...相同的所有接口,但另一方面,您只需执行一次即可完成。