是否有内置的方法来限制System.Collection.Generics.Stack的深度?因此,如果您处于最大容量,推送新元素将删除堆栈的底部?
我知道我可以通过转换为数组并重建堆栈来实现它,但我认为可能已经有了一个方法.
编辑:我写了一个扩展方法:
public static void Trim(this Stack stack, int trimCount) { if (stack.Count <= trimCount) return; stack = new Stack ( stack .ToArray() .Take(trimCount) ); }
因此,它在修剪时返回一个新的堆栈,但不是不可变的功能方式=)
这样做的原因是我在堆栈中存储应用程序的撤消步骤,我只想存储有限数量的步骤.
您正在寻找的是一个辍学堆栈.AFAIK,BCL不包含一个,尽管它们很容易实现.通常,撤消和重做功能依赖于此类数据结构.
它们基本上是一个数组,当你推入堆栈时,堆栈的"顶部"会在数组周围移动.最终,当堆栈已满并且替换堆栈的"底部"时,顶部将回绕到开头.
谷歌没有提供太多信息.这是我能找到的最好的:
(警告PDF) http://courses.cs.vt.edu/~cs2704/spring04/projects/DropOutStack.pdf
这里有一些锅炉板代码,可以帮助您入门.我会让你填写其余的(完整性检查,计数,索引器等)
class DropOutStack{ 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]; } }