用Java不同的实现Stack和Queue的原因?

时间:2018-08-16 20:52:32

标签: java data-structures stack queue time-complexity

堆栈已使用Java中的可调整大小的数组(矢量)实现。但是,据我了解,尽管您可以选择,但是通常使用LinkedList实例化队列以用于常见应用程序。

我知道理论上他们支持O(1)最坏情况或分期偿还的所有操作。但是,是否有特定原因导致可调整大小的数组更适合堆栈,而链表更适合队列?

换句话说,为什么他们都不使用可调整大小的数组或链接列表?

2 个答案:

答案 0 :(得分:5)

  

我知道理论上他们支持O(1)最坏情况或分期偿还的所有操作。

您似乎误会了,因为Stack#searchO(n)操作。

  

...而链表更适合排队吗?

LinkedList的{​​{3}}所述,Queue用作ArrayDeque时不太可能是最佳的:

  

[ArrayDeque]用作堆栈时,可能比Stack快,而用作队列时,则比LinkedList快。


  

换句话说,为什么他们都不使用可调整大小的数组或链接列表?

由于Stack是过时的类,因此不应该使用,如其documentation所指定:

  

Deque接口及其实现提供了一组更完整和一致的LIFO堆栈操作,应优先使用此类。

答案 1 :(得分:2)

之所以这样称呼堆栈,是因为它们“堆栈”。一个对象位于另一个对象之上。这些堆叠对象的迭代需要很胖,通常是为了快速读写堆栈而设计的。 ArrayList(或可调整大小的数组)使用单个动态数组来存储数据。向阵列添加新内容并不是最快的事情,但是由于它是单个阵列,因此读写速度更好。

队列只是简单地一个接一个地排队的数据字符串。无论如何,队列通常会不断增长。想想音乐队列,歌曲被多次添加。但是,音乐的读取是非常基本的,因此读取和写入不需要花费太多时间。链表使用双链表进行操作,这样可以加快添加/删除时间,但降低读写速度。

希望这可以回答您的问题。 干杯!