【发布时间】:2016-05-25 05:24:24
【问题描述】:
我是堆栈新手。众所周知,如果堆栈空间不足,我们想将一个元素压入堆栈,则堆栈将处于溢出状态。当我们使用基于数组的堆栈实现时会发生这种情况,因为我们必须定义数组的容量。如果我们要推送一个超出容量的元素,就会发生溢出,但是如果我们使用链表进行堆栈实现,那么堆栈溢出将如何发生?在链表中我们需要不定义任何容量,它为节点动态分配内存。请帮助我识别问题。提前致谢。
【问题讨论】:
我是堆栈新手。众所周知,如果堆栈空间不足,我们想将一个元素压入堆栈,则堆栈将处于溢出状态。当我们使用基于数组的堆栈实现时会发生这种情况,因为我们必须定义数组的容量。如果我们要推送一个超出容量的元素,就会发生溢出,但是如果我们使用链表进行堆栈实现,那么堆栈溢出将如何发生?在链表中我们需要不定义任何容量,它为节点动态分配内存。请帮助我识别问题。提前致谢。
【问题讨论】:
我建议使用链表。据我所知,链表中没有堆栈溢出。这就是为什么我们使用该数据结构而不是像列表、堆栈这样的数组实现。链表的实现很长(但您可以使用预定义的库)和高缓存使用率。但它适合保存动态大小的数据,因为它具有 为节点动态分配内存 的属性,如上所述。
希望这会有所帮助!
【讨论】:
你说得对,链表不需要根据元素的数量来定义它的容量。但是元素仍然需要内存 - 并且可能会发生内存耗尽。
将堆栈实现作为列表执行会导致性能下降(因为分配/解除分配必须更频繁地完成),如果您认为必须在堆栈上分配不同大小的内存块,则更加复杂。堆栈的使用如此广泛,以至于其实施中的任何放缓都可能令人望而却步。
列表的管理也更难 - 你必须管理堆栈,例如一次添加多个元素,或在一次操作中“缩短”堆栈(获取/忘记其上的多个元素,例如从函数调用返回时)等。单向列表仅适用于在其上附加/删除一个元素结束。
你有什么具体的问题要解决吗?请记住,堆栈溢出不仅可能发生在在其上创建的大型数据结构中,还可能发生在递归太深的情况下。
【讨论】: