在c中实现堆栈

时间:2012-05-24 14:07:42

标签: c malloc

我想制作与动态内存分配一致的堆栈,但我需要知道它更有效:
或者我可以有一个初始大小= 1,并为每个新输入添加一个地方。 !?!

int *tmp = malloc(sizeof(int) * 2 * dm->capacity); \* dm->capacity = 10 *\
int *tmp = malloc(sizeof(int));

4 个答案:

答案 0 :(得分:7)

在需要时加倍是更有效率的。

如果为每个推送操作分配一个新数组,那么你的工作量与堆栈元素数量的 square 成正比(当你推送元素N+1时,你必须将以前的N元素复制到新数组中。

如果在需要时将数组加倍,那么你所做的副本数量与N的对数成正比,对于任何非平凡大小的堆栈,这个数量要小得多,正如你所知。

答案 1 :(得分:1)

这是一个破碎的问题。哪个“更有效”完全取决于您的域名。如果你有很多长度为3和4的堆栈,那么预先分配10个并且随后睡眠5年将比从1开始加倍并且加倍。如果你有很多长度为1的堆栈,那么分配10就是浪费。

当然,当我说“浪费”时,我的意思是浪费几个宝贵的纳秒,你永远无法回头。假设您使用的是“正常”计算机并且未在Conway的生命游戏中实现C或任何异常,在这种情况下,这些分配可能很重要。所以,对它进行分析并找出答案。

如果你想要一些简单而且更有效的东西,那么之后需要分配10个,然后再需要加倍。

答案 2 :(得分:1)

这取决于。通常加倍会更有效,但这种方法可能会浪费大量空间(未使用的分配空间的一半)。你的增强方法没有那个缺点。然而,在每次添加时都必须复制整个数组是非常低效的。因此,如果空间效率是您最关心的问题,那么最好将堆栈表示为链表。

答案 3 :(得分:0)

在必要时将堆栈大小加倍的摊销成本远低于初始化为1.所以是的,加倍更好。话虽如此,我还建议适当的删除方案。当使用当前堆栈的1/4时,沿着释放堆栈一半的行。通过这种方式,边缘加法和减法不会破坏效率。