【问题标题】:Most efficient way to implement stack and queue together?一起实现堆栈和队列的最有效方法?
【发布时间】:2015-05-01 17:37:44
【问题描述】:

在单个数据结构中有效地实现堆栈和队列的最合适方法是什么。元素的数量是无限的。检索和插入都应该在恒定时间内发生。

【问题讨论】:

  • 摊销常数时间也可以吗?
  • 这不是deque 所做的吗?

标签: algorithm data-structures stack queue


【解决方案1】:

双向链表具有您想要的所有计算复杂性属性,但缓存局部性较差。

允许在头部和尾部追加和删除的ring buffer (array)具有相同的复杂性特征。它使用动态数组并需要重新分配,一旦元素数量超过其容量。

但是,类似于数组列表/向量,在实践中,顺序访问通常比链表更快。在大多数情况下,它会比使用双向链表实现更快且内存效率更高。

这是dequeue 抽象数据结构的可能实现之一,参见例如Java 中的ArrayDeque<E> 实现。

【讨论】:

    【解决方案2】:

    doubly linked list 可以解决这个问题,所有操作都需要固定时间:

    • 它允许push()enqueue() 通过将元素附加到 以恒定时间列出。
    • 它允许pop() 在恒定时间内删除最后一个元素
    • 它允许dequeue() 通过删除第一个元素,也是在恒定时间内。

    【讨论】:

    • @MarkPercieval 我很确定您可以用 java 编写代码,如果您遇到任何问题,请告诉我们。毕竟这是你的任务
    【解决方案3】:

    双向链表最适合此操作。列表中的每个节点都有两个引用:一个指向它之前的项目,一个指向它之后的项目。主列表对象在列表前面维护对项目的引用,在列表后面维护对项目的引用。

    任何时候它插入一个项目,列表:

    1. 创建一个新节点,为其提供对列表中前一个第一个或最后一个节点的引用(取决于您是添加到前面还是后面)。
    2. 连接之前的第一个或最后一个节点以指向新创建的节点。
    3. 更新自己对第一个或最后一个节点的引用,以指向新节点。

    从列表的前面或后面删除一个项目可以有效地逆转这个过程。

    插入到结构的前面或后面总是一个 O(1) 操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-12
      • 2021-07-08
      • 2011-12-01
      • 2018-06-14
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多