我一直试图弄清楚以下堆栈实现的定义究竟是什么以及与每个堆栈实现相关的优缺点。
1.Array-based implementation
2.Linked implementation
3.Blocked implementation
非常感谢任何帮助。
答案 0 :(得分:0)
堆栈实现的用户需要动态数据结构。 C不直接以语言术语提供。你必须分配和管理自己的内存。
分配数组,因此静态大小的结构非常容易。但是,您遇到的问题是,最大条目数量有限。如果你使数组太小,这将导致错误,如果你使数组非常大,你就是在等待内存。
对此的解决方案是,如果条目数超过数组大小,则动态重新分配数组。但这会将整个内存移动到内存中的另一个位置,这有什么缺点。 (例如,您必须复制整个记忆,并且不可能指向特定条目。)
拥有链接列表则恰恰相反。您(动态)为每个条目分配内存。从堆栈中删除时,您可以释放内存以获取单个条目。这听起来更好,但有一点需要注意,你为每个条目花了一个指针大小的内存。通常,这是条目的大小。所以你加倍了内存消耗。除此之外,一遍又一遍地分配小块内存也会浪费内存。
所以你可以实现一个折衷:一个链接的数组列表:为多个条目分配一个块,比方说256.然后用条目填充该块,而不重新分配或分配内存。如果条目数超过该值,则为其他256个条目分配新块。这些块是链接的。所以它是一个数组的链接列表。
ESP。对于堆栈 - 在结构中间没有删除 - 在大多数情况下这是最好的实现。
答案 1 :(得分:0)
考虑每个数据结构占用多少空间,以及是否可以有效地对它们进行堆栈操作;即在O(1)时间内。
对于基本堆栈,您需要能够将新元素推送到堆栈,并弹出最近推送(顶部)元素。您可能还想查看顶部元素,并检查堆栈是否为空。
动态大小的数组(或块,如果我正确理解OP的注释)对于堆栈来说是好的。在某些情况下,如果您要访问和更改堆栈很多,并希望避免在每次推送或弹出时分配和销毁内存的少量额外工作,这可能是有利的。它还为您提供对堆栈中所有内容的直接索引访问,以实现扩展功能。缺点是堆栈会占用一些额外的空间。
您也可以使用单链接列表进行堆叠,并在头部推送和弹出。这可能是最常用的类型结构,如果你不需要扩展功能,比如直接访问除头部之外的元素,以及你是不是想在时间效率的最前沿实现某些东西。