c-为什么栈被实现为链表?需要什么,为什么阵列实现还不够

  • 本文关键字:实现 阵列 不够 链表 c stack linked-list
  • 更新时间 :
  • 英文 :


很多时候,堆栈都是作为链表来实现的,数组表示是否不够好,在数组中我们可以轻松地执行推送弹出,而链表覆盖数组使代码复杂化,与数组实现相比没有优势。

你能举一个链表实现更有益的例子吗?或者我们离不开它。

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

阵列通常更高效,因为您可以将堆栈节点都放在相邻的内存中,这些内存可以很好地放在处理器上的快速缓存行中。

我想你会看到使用链表的堆栈的教科书式实现,因为它们更容易编写,并且不会强迫你写一点额外的代码来管理后备阵列存储,以及提出增长/复制/保留空间启发式方法。

此外,如果您真的需要使用很少的内存,那么链表实现可能是有意义的,因为您不会"浪费"当前未使用的空间。然而,在具有充足内存的现代处理器上,通常最好使用数组来获得它们所提供的缓存优势,而不是使用链表方法来担心页面故障。

数组的大小是有限的,并且是预定义的。当你们不知道他们有多少时,链表是一个完美的选择。

更详细的比较:-(+表示主导链表,-表示数组)

Size and type constraint:-

  1. (+)阵列的其他成员以相等的距离排列,需要连续内存,而在另一边,链表可以提供非连续内存解决方案,因此有时在数据量巨大的情况下也有利于内存(避免cpu轮询资源)。

  2. (+)假设在一个例子中,您使用一个数组作为堆栈,并且该数组的类型为int。现在,您将如何在其中容纳一个double??

Portability

  1. (+)数组可能会导致异常,如索引越界异常,但您可以在链表中随时增加链

Speed and performance

  1. (-)如果这与性能有关,那么显然阵列的大部分复杂性都在O(1)左右。如果是链表,则必须选择一个起始节点来启动跟踪,这会增加性能损失

当堆栈的大小变化很大时,如果您有总是分配巨大数组的通用例程,则会浪费空间。

显然,固定大小的数组在事先知道最大大小方面有局限性
如果考虑dynamic array,那么链表与数组将涵盖细节,包括执行操作的复杂性。

Stack是使用链表实现的,因为与数组的O(n)相比,Push和Pop操作的时间复杂度为O(1)。(除了链表中灵活的大小优势外)

最新更新