Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 为什么要用两个堆栈组成一个队列?_List_Abstract Data Type - Fatal编程技术网

List 为什么要用两个堆栈组成一个队列?

List 为什么要用两个堆栈组成一个队列?,list,abstract-data-type,List,Abstract Data Type,如果使用数组实现,我可以看到使用两个堆栈的优势,因为使用数组比使用队列更容易实现堆栈。 但如果使用链表,有什么好处? 将堆栈弹出到队列中会增加链表和数组实现的开销。这是一种很好的学习体验,但并不实用。您可以使用两个不可变堆栈创建一个不可变队列 但是,如果您只是想要一个可变队列,那么使用两个堆栈是一种比使用链表更慢、更复杂的好方法。这是在函数式编程语言中使用纯函数(不可变但共享结构)列表(例如Clojure、Haskell、Erlang…)实现队列的常见方法: 使用一对列表表示队列,其中元素在第

如果使用数组实现,我可以看到使用两个堆栈的优势,因为使用数组比使用队列更容易实现堆栈。 但如果使用链表,有什么好处?
将堆栈弹出到队列中会增加链表和数组实现的开销。

这是一种很好的学习体验,但并不实用。

您可以使用两个不可变堆栈创建一个不可变队列


但是,如果您只是想要一个可变队列,那么使用两个堆栈是一种比使用链表更慢、更复杂的好方法。

这是在函数式编程语言中使用纯函数(不可变但共享结构)列表(例如Clojure、Haskell、Erlang…)实现队列的常见方法:

  • 使用一对列表表示队列,其中元素在第一个列表中按FIFO顺序排列,在第二个列表中按LIFO顺序排列
  • 通过在第二个列表前面加上前缀,使队列排队
  • 从队列中取出第一个列表的第一个元素
  • 如果第一个列表为空:反转第二个列表并用它替换第一个列表,然后用空列表替换第二个列表
(除任何可能的返回值外,所有操作都返回新队列对象)


关键是,在纯函数列表的前面添加(删除)一个元素是O(1),而反向操作是O(n)在所有的出列中摊销,因此它接近O(1),从而得到一个~O(1)具有不可变数据结构的队列实现。

此方法可用于使用两个基于原子单链表的堆栈(如Win32提供的堆栈)构建队列。 算法可以如中所述,但重新打包步骤(项目符号4)可以稍微优化


无锁数据结构和算法是(对我们中的一些人来说)非常令人兴奋的编程领域,但必须非常小心地使用它们。在一般情况下,基于锁的算法更有效。

谁使用两个堆栈组成队列?我真的不理解这种情况(对不起:(在多个写入程序单读取器的情况下,很容易以高效的无锁方式处理“排队”操作,同样地,如果在收件箱上以“全部弹出”操作开始出列(不必锁定写入程序,并假设只有一个读取器),则出列也很容易(基本上是一个
互锁的.Exchange
)。如果可能有多个读卡器,最好让它们使用锁定在彼此之间进行仲裁(它们的锁定不会影响写入程序)。这就是我来这里寻找的解释。祝你好运,先生。第二步,我相信最后一个字应该是
列表
,而不是
队列
,这样就好像
在第二个列表前排队一样。
。谢谢@LihangLi,修正了!