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

标签 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)
            );           
    }

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

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

最佳答案

您正在寻找的是dropout stack。 AFAIK,BCL 不包含一个,尽管它们实现起来很简单。通常撤消和重做功能依赖于此类数据结构。

它们基本上是一个数组,当您压入堆栈时,堆栈的“顶部”会在数组周围移动。最终,当堆栈已满时,顶部将回到开头并替换堆栈的“底部”。

Google 没有提供太多相关信息。这是我能找到的最好的:

(警告 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];
    }
}

关于c# - 我可以限制通用堆栈的深度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384042/

相关文章:

需要全面清晰的 NOP sled 技术解释

c# - 如何利用 EF 和 LINQ 添加过滤器并动态指定表、列、过滤器和排序依据

c# - 我如何返回匹配项的计数

c# - 将矩形图像拆分为多边形以模拟 splinter 玻璃

C# Language : generics, open/closed, bound/unbound, constructed

c - 从C中的堆栈中删除字符串

c# - 如何在 WPF 中制作具有单个捕捉点的 Slider 控件?

java - 引用 Java 中的集合类型函数

c# - 将受约束的泛型类型传递给非泛型方法

c - C中栈的数据结构