在单个数据结构中,有效地实现堆栈和队列的最合适方法是什么。元素的数量是无限的。检索和插入都应该在固定的时间内发生。
答案 0 :(得分:4)
双向链表,具有您想要的所有计算复杂性属性,但缓存局部性较差。
允许在头部和尾部追加和删除的 ring buffer (array) 具有相同的复杂性特征。它使用动态数组,一旦元素数量超出其容量,就需要重新分配。
但是,类似于数组列表/向量通常在顺序访问和链接列表的实践中更快。在大多数情况下,它比使用双向链表实现更快,内存效率更高。
这是dequeue抽象数据结构的可能实现之一,例如, Java中的ArrayDeque<E>
实现。
答案 1 :(得分:2)
双向链表最适合这个。列表中的每个节点都有两个引用:一个引用它之前的项目,另一个引用它之后的项目。主列表对象维护对列表前面的项目和列表后面的项目的引用。
任何时候它插入一个项目,列表:
从列表的正面或背面删除项目可以有效地反转此过程。
插入结构的正面或背面始终是O(1)操作。
答案 2 :(得分:2)
doubly linked list可以解决这个问题,所有操作都需要一段时间:
push()
或enqueue()
将元素附加到。{
在恒定时间列出。pop()
删除常量时间中的最后一个元素dequeue()
删除第一个元素,也是在恒定时间内。