2010-01-12 28 views
2

什么是 最好 正确在C中实现动态调整大小的堆栈的方式?在C中实现动态调整大小的堆栈的最佳方式是什么?

例如,我想的存储器的量分配到一个堆栈,但是当该堆栈得到充分,分配被加倍存储器,以适应新的数据等

我已经堆叠在一分钟使用实施一个简单的void指针数组,这样我就可以存储所有类型的指针,所以它可以重用。当我尝试使用malloc()/ realloc()执行此操作时,由于void指针没有指定大小,因此在执行指针数学时遇到错误。

什么是 最佳 正确在C中实现动态可调整大小的堆栈的方法?

编辑:

我试图像这样的代码(检查删除错误),但我现在明白了,我不能像这样的空指针交互。所以我只是在思考如何合法地做这样的事情。这是一个很大的学习锻炼对我来说,因为我从来没有真正接触过C.

#include <stdio.h> 
#include <stdlib.h> 

#include "stack.h" 

static int index = 0; 

void* CreateStack(void) 
{ 
    void *stack = malloc(INITIAL_STACK_SIZE); 
    return stack; 
} 

void* Pop(void *stack) 
{ 
    return stack + index--; 
} 

void Push(void *stack, void *value) 
{ 
    *(stack + index) = value; 
} 

void FreeStack(void *stack) 
{ 
    free(stack); 
} 
+9

请张贴一些代码。指针本身必须占用固定数量的内存才能存储,而不管它们指向什么。 – 2010-01-12 22:57:57

+1

你是什么意思的“最好”? – 2010-01-12 23:09:14

+0

基本上有两种方法:1)使用增长数组,2)使用链表。什么对你最好(或者是正确的)取决于你需要什么。 – MAK 2010-01-14 21:57:41

回答

1

一种方法是使用数组作为堆栈。跟踪阵列容量。如果数组变满,请分配一个新数组,将旧元素复制到新数组,然后删除旧数组。

另一种选择是使用链表作为堆栈的基础。这允许对每个新元素进行动态分配。

4

我认为这个问题是您使用了错误的大小在您的来电。你不需要指针的大小 - 你想要指针本身的大小。

3

听起来像你直接做

malloc(n * sizeof(void)) 

或间接地,你需要

malloc(n * sizeof(void*)) 
当然

真正的答案是的std ::堆栈(在C++)

+2

不,真正的答案是java.util.Stack(Java)。或者甚至更好,一个Lisp列表。 – 2010-01-12 23:23:07

+0

真正的答案是......练习! – 2010-01-12 23:26:21

+5

C++从来不是C语言问题的真正答案,除了“如果向C添加两个加号,你会得到什么?” – Chuck 2010-01-12 23:44:54

1

我已经作为前面问题的子集,回答了这个问题:

https://stackoverflow.com/questions/2006726/which-would-you-prefer-to-have-to-maintain/2007647#2007647

你必须稍微调整一下 - 用void *替换char *,将“addString”重命名为“push”并编写一个“pop”函数。哦,并且对malloc和realloc的调用添加错误检查,这在回答中被省略了,因为它在提问者的代码中被省略了。

就像尼尔说的,虽然“最好”是非常主观的。数组的增长只是实现堆栈的一种方式。根据使用模式以及您对代码复杂性,速度和内存使用的要求,您可能需要一个链表,或者您可能需要类似于C++中std::deque类的混合列表/数组策略。

相关问题