为什么堆栈实现为链表?有什么需要,为什么阵列实现不够?

时间:2012-08-21 14:16:00

标签: c stack linked-list

很多时候,堆栈是作为链表实现的,数组表示不够好,在数组中我们可以轻松地执行push pop,并且数组上的链表复杂化代码,并且没有优于数组实现的优势。

你能给出一个链表实现更有益的例子,或者我们不能没有它。

5 个答案:

答案 0 :(得分:2)

我想说堆栈的许多实际实现是使用数组编写的。例如,.NET Stack实现使用数组作为后备存储。

数组通常效率更高,因为您可以将堆栈节点放在连续内存中,这些内存可以很好地适应处理器上的快速缓存行。

我想你会看到使用链表的堆栈的教科书实现,因为它们更容易编写,并且不会强迫你编写一些额外的代码来管理支持数组存储以及提出增长/ copy / reserve space heuristic。

此外,如果您真的被迫使用很少的内存,那么链表实现可能会有意义,因为您不会“浪费”当前未使用的空间。但是,在具有大量内存的现代处理器上,通常最好使用数组来获得它们提供的缓存优势,而不是担心使用链表方法的页面错误。

答案 1 :(得分:1)

阵列的大小是有限的和预定义的。当你不知道有多少人在那里时,链表是一个完美的选择。

更详细的比较: - (+用于控制链表和 - 用于数组)

Size and type constraint:-

  1. (+)数组的其他成员以相等的距离对齐并且需要连续的内存,而在另一侧链接列表可以提供非连续的内存解决方案,所以有时它对于内存以及大数据的情况也是有益的(避免对资源进行cpu轮询)。

  2. (+)假设在你使用数组作为堆栈的情况下,数组的类型为int。现在你将如何容纳一个double?

  3. Portability

    1. (+)数组可能导致异常,例如索引超出范围的异常,但您可以随时在链表中增加链。
    2. Speed and performance

      1. ( - )如果关于性能,那么显然大多数复杂性都落在数组的O(1)附近。如果是链表,你将不得不选择一个起始节点来开始跟踪,这会增加性能损失

答案 2 :(得分:0)

当堆栈的大小变化很大时,如果你有一个总是分配一个庞大数组的通用例程,你就会浪费空间。

答案 3 :(得分:0)

显然,固定尺寸的阵列在掌握前知道最大尺寸的限制 如果您考虑dynamic array,则Linked List vs. Arrays会涵盖详细信息,包括执行操作的复杂性。

答案 4 :(得分:0)

使用链接列表实现堆栈,因为与数组的O(n)相比,推送和弹出操作具有O(1)时间复杂度。 (除了链接列表中灵活的大小优势)