最有效的方式实现堆栈和队列?

时间:2015-05-01 17:37:44

标签: algorithm data-structures stack queue

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

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

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

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

  1. 创建一个新节点,为其提供对列表中前一个或最后一个节点的引用(取决于您是添加到前面还是后面)。
  2. 将前一个或最后一个节点连接到指向新创建的节点。
  3. 更新自己对第一个或最后一个节点的引用,以指向新节点。
  4. 从列表的正面或背面删除项目可以有效地反转此过程。

    插入结构的正面或背面始终是O(1)操作。

答案 2 :(得分:2)

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

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