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

是否有内置的方法来限制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) ); } 

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

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

您正在寻找的是一个辍学堆栈 。 AFAIK,BCL不包含一个,尽管它们实施起来很简单。 通常,撤消和重做function依赖于此类数据结构。

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

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

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

你实际上正在寻找类似于循环列表实现的东西。 PIEBALDconsult在CodeProject上实现了一个LimitedQueue实现。 它与您的要求类似。 你只需要像作者所做的那样包装Stack而不是Queue。 此外,作者还实现了索引器,如果您需要访问除顶层堆栈之外的任何其他内容(可能显示撤消列表),这将非常方便。

编辑:作者的实现也引发了一个事件,当最后一个(首先,取决于它是一个队列还是堆栈)被删除,以便你可以知道什么时候被扔掉。

对于其他任何人,在尝试限制其撤消/重做堆栈大小时遇到​​此问题,这是最佳解决方案(使用LinkedList):

限制generics集合的大小

我看不出办法。 您可以从Stackinheritance,但似乎没有任何有用的覆盖。

简单(如果有点乏味)的方法是将Stack包装在你自己的,比如, LimitedStack 。 然后实现您想要的方法并传递给内部Stack ,同时在Push方法中包含您的限制逻辑以及您需要的任何其他位置。

编写所有这些传递成员是很痛苦的,特别是如果你实现了与Stack相同的所有接口……但另一方面,你只需要做一次然后就完成了。

我相信你正在寻找一个(可能被修改的) dequeue–允许从任何一端访问的数据结构。