是否有内置方法来限制 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)
);
}
因此,它在修剪时返回一个新堆栈,但不变性不是功能方式 =)
原因是我将应用程序的撤消步骤存储在堆栈中,并且我只想存储有限数量的步骤。
你正在寻找的东西叫做丢弃堆栈。 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];
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)