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

2023-11-28

是否有内置方法来限制 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(使用前将#替换为@)

我可以限制通用堆栈的深度吗? 的相关文章

随机推荐

  • 使用 jQuery 制作 Translate3d 动画

    我正在尝试使用 Jquery 2 1 1 为translate3d 制作动画 10 秒后 然后 当动画完成时 我希望它提醒我 但问题是它没有动画 它会立即更改为新的 css 有大侠可以帮我解决这个问题吗 我现在使用的代码 circle an
  • 使用 apache cordova 构建 Android 应用程序时出错

    我已经在 linux mint 17 1 xfce jdk 和 android 上安装了 cordova npm 没问题 我可以创建新的 cordova 应用程序并向其添加 android 平台 科尔多瓦创造 cordova平台添加andr
  • 验证引导模式中的输入文本

    我想在不使用任何框架的情况下验证引导模式中的表单 它实际上是一个简单的模式 只有一个输入文本和两个按钮 关闭 和 发送 用户应在输入框中输入他 她的姓名 然后单击发送 表单是通过 post 方法发送的 我想要做的是 如果用户没有在输入框中输
  • C# 字段与属性[重复]

    这个问题在这里已经有答案了 可能的重复 C 中属性和字段的区别 我认为基本属性 get set 与公共字段相同 唯一的优点是能够在不破坏二进制兼容性的情况下更改它们 按照我在这里得到的答案https stackoverflow com a
  • 基于 FLEX 的应用程序的自动化测试

    建议使用哪些工具 最好是开源工具 在基于 FLEX 的 Web 应用程序上驱动自动化测试套件 如果同一工具还具有驱动 Web 服务的内置功能 那就太好了 Adobe 自己分发了一个测试框架 FlexUnit
  • 如何在 C# 中删除被另一个进程锁定的文件?

    我正在寻找一种方法来删除被另一个进程使用 C 锁定的文件 我怀疑该方法必须能够找到哪个进程正在锁定文件 也许通过跟踪句柄 尽管我不确定如何在 C 中执行此操作 然后在能够使用以下命令完成文件删除之前关闭该进程File Delete 杀死其他
  • Google 表格中的日期时间和时区?

    我想计算 Google 表格中不同时区的日期时间之间的时差 如果我将两个字段格式化为 日期时间 另一个字段格式化为 持续时间 我可以使用差异运算符成功计算同一时区内的差异 Example A1 1 10 2016 10 10 00 B2 1
  • Langford 序列实现 Haskell 或 C

    在组合数学中 兰福德配对 也称为 Langford 序列 是以下序列的排列2n数字1 1 2 2 n n 其中两个 1 相距 1 个单位 两个 2 相距 2 个单位 更一般地 每个数字 k 的两个副本相距 k 个单位 例如 兰福德配对n 3
  • Java 正则表达式线程安全吗?

    我有一个使用的函数Pattern compile and a Matcher在字符串列表中搜索模式 该函数在多线程中使用 每个线程都会有一个唯一的模式传递给Pattern compile当线程被创建时 线程和模式的数量是动态的 这意味着我可
  • 读取多个文件并根据用户输入计算平均值

    我正在尝试在 R 中编写一个需要 3 个输入的函数 目录 污染物 id 我的计算机上有一个目录 里面充满了 CSV 文件 即超过 300 个 该函数的功能如下所示 pollutantmean lt function directory po
  • 调用同步 xm​​lhttprequest 时 IE 挂起 5 分钟

    我有一个 Web 应用程序 并使用 ajax 回调我的网络服务器来获取数据 有时 在相当不可预测的时刻 但可以重现 IE 完全挂起 5 分钟 窗口显示 未响应 然后返回 xmlhttprequest 对象响应错误 12002 我可以重现它的
  • 点击NSView

    我有一个NSView包含多个子视图 其中一个子视图是透明的并分层在顶部 我需要能够点击这个视图到下面的子视图 以便下面的视图获得第一响应者状态 但是所有鼠标事件都卡在顶部视图上 alpha 是1 因为我在里面画了东西 所以它应该只点击透明区
  • 更改滚动条上的 div 高度

    我想要的是顶部 标题 的 div 当您第一次加载页面时 它将处于最大高度 50px 当您向下滚动页面时 我希望高度平滑地降低到 30px 的最小高度 我猜我应该使用 jQuery 但我没有那么丰富的经验 所以我现在不知道解决方案 这是我当前
  • Angular 2 - 如何在 addEventListener 处理函数内调用打字稿函数?

    我正在尝试在添加到页面跨度的处理程序函数内调用另一个打字稿函数 任何类型 当我这样做时 处理函数工作正常 并且会执行基本的操作 例如设置变量 console log 等 但是 当尝试调用任何类型的函数时 它会抛出 无法读取未定义的属性 fu
  • 如何在 PHP 中更好地使用 Smarty?

    我发现在 PHP 中使用 Smarty 有时需要花费额外的时间 1 使用与 PHP 本身完全不同的语法2 需要检查小案例 因为文档没有提供更详细的细节 例如 逃逸 http www smarty net manual en language
  • 是否可以从 C++ 中的模板类型获取 char* 名称

    我想获取模板类型的字符串名称 const char 不幸的是我无法访问 RTTI template lt typename T gt struct SomeClass const char GetClassName const return
  • 如何增加 Flutter 中特定列表项的计数器?

    就像下面的示例图片一样 我想在单击单个列表项的按钮时增加或减少数量 如果我增加 setState 中的计数器 它会在每个列表项中递增 我需要这方面的帮助 特别是在处理 Flutter 中的特定列表项时 示例图片 2 任何帮助表示赞赏 提前致
  • 更新 ElasticSearch 设置中的分析器

    我正在使用 Sense Chrome 插件 并且我已经成功设置了一个分析器并且它工作正常 如果我对设置发出 GET media settings 则会返回以下内容 media settings index creation date 142
  • 如何将 console.log 写入文件

    现在我使用以下方式显示信息 console log kraken id markets 但是 我想将所有发送到控制台的信息写入文件中 如何通过完成以下代码来完成此操作 use strict var ccxt require ccxt asy
  • 我可以限制通用堆栈的深度吗?

    是否有内置方法来限制 System Collection Generics Stack 的深度 那么 如果您处于最大容量 推入新元素会删除堆栈的底部吗 我知道我可以通过转换为数组并重建堆栈来做到这一点 但我认为可能已经有一个方法了 编辑 我