我尝试使用C语言中的结构和动态内存分配来模拟堆栈(将值推入并弹出堆栈顶部),我有这样的结构:
...
#define max 5
typedef struct stack
{
int stk[max];
int top;
}STACK;
...
我成功模拟了堆栈,但是当它达到最大大小(堆栈已满)时,我想更改max
的值,以便继续向堆栈顶部添加(推送)值。换句话说,我只想重新分配结构的stk
字段中的最大值,如果可能的话。
任何建议都表示赞赏。
答案 0 :(得分:3)
使用int stk[max];
不是动态内存分配。
您需要指针int * stk;
并使用malloc
对其进行初始化。然后realloc
需要更多内存时。当不再需要堆栈时,请使用free
释放它。
答案 1 :(得分:0)
试试这样:
typedef struct stack
{
int *stk;
int top;
}
signed int array_resize(stack *s, size_t size)
{
if(!s) return -1;
s->stk = realloc(s->stk, size * sizeof(int));
return 0;
}
这将重新分配整数数组的空间。我不知道如何做到这一点。
答案 2 :(得分:0)
正如@ user694733指出的那样,你必须使用动态内存。另一个例子可以是:
typedef struct stack
{
int top;
int max;
int stk[];
}STACK;
STACK *init_stack(int m){
STACK *st = (STACK *)malloc(sizeof(STACK)+m*sizeof(int));
st->top = 0;
st->max = m;
return st;
}
STACK *resize_stack(STACK *st, int m){
if (m<=st->max){
return st; /* Take sure do not kill old values */
}
STACK *st = (STACK *)realloc(sizeof(STACK)+m*sizeof(int));
st->max = m;
return st;
}
现在您可以在程序中使用该功能,如:
void main(void){
STACK *st = init_stack(5);
.... do something bu you need more room....
st = resize_stack(st,100);
..... Now is small again .....
st = resize_stack(st,5);
}
请注意每个realloc
调用具有线性成本,因此您无法使用它来添加常量元素:更好地使用几何扩展。看看http://en.wikipedia.org/wiki/Dynamic_array作为动态数组的起点。