Tom*_*Tom 11 list abstract-data-type
如果使用数组实现,我可以看到使用两个堆栈的优势,因为使用数组比使用数组更容易实现堆栈.但是如果使用链接列表,有什么优势呢?将堆栈弹出到队列上的行为增加了链表和数组实现的开销.
liw*_*iwp 18
这是在函数式编程语言中使用纯函数(不可变但共享结构)列表(例如Clojure,Haskell,Erlang ...)实现队列的常用方法:
(除了任何可能的返回值之外,所有操作都返回新的队列对象)
关键是在纯函数列表的前面添加(删除)元素是O(1),并且O(n)的反向操作在所有出列上分摊,因此它接近于O(1) ),从而为您提供具有不可变数据结构的~O(1)队列实现.
此方法可用于使用两个基于原子单链接列表的堆栈构建无锁队列,例如由Win32:Interlocked Singly Linked Lists提供.该算法可以如liwp的回答中所述,尽管重新包装步骤(子弹4)可以稍微优化一下.
无锁数据结构和算法是一个非常令人兴奋的(对我们中的一些人)编程领域,但必须非常小心地使用它们.在一般情况下,基于锁的算法更有效.