#ifndef STACK_TO_QUEUE_H #define STACK_TO_QUEUE_H #include<stdio.h> #include<stdlib.h> #define ALLOC_SIZE 1024 #define ElemType int typedef struct sqstack { ElemType *top; ElemType *base; ElemType stack_size; }SqStack; //顺序栈 typedef struct sqqueue { SqStack front; SqStack rear; }SqQueue; void InitStack(SqStack *s) { if((s->top=(ElemType*)malloc(ALLOC_SIZE*sizeof(ElemType)))==NULL) { printf("stack malloc error\n"); exit(1); } s->base=s->top; s->stack_size=ALLOC_SIZE; } int pop_stack(SqStack *s,ElemType *data) { if(s->top!=s->base) { s->top--; *data=*s->top; //s->stack_size--; return 1; } else //返回值为0,表示栈为空 { return 0; } } void push_stack(SqStack *s,ElemType data) { if((s->top-s->base)>=s->stack_size) { if((s->base=(ElemType *)realloc(s->base,(s->stack_size+ALLOC_SIZE)*sizeof(ElemType)))==NULL) { printf("stack realloc error\n"); exit(1); } else { s->stack_size+=ALLOC_SIZE; } } *(s->top)=data; s->top++; //s->stack_size++; } } #endif
上面这个是头文件:stack_to_queue.h
下面是主函数文件:
#include<stdio.h> #include<stdlib.h> #include"stack_to_queue.h" int main() { SqStack s; int i,status,data; InitStack(&s); for(i=0;i<2049;i++) { push_stack(&s,i); } printf("%d\n",s.top-s.base); while((status=pop_stack(&s,&data))!=0) { printf("%d ",data); } printf("%d\n",s.top-s.base); return 0; }
说明一下:代码实现的就是一个栈(因为我在做的是用两个栈实现一个队列,所以头文件的名字是stack_to_queue),栈的初始大小ALLOC_SIZE是1024,所以当压栈的数目(这里是2049)大于这个值时,需要重新分配空间,而出错就是在这里,要么分配失败,要么出现很奇怪的数字。求大神指点啊!!纠结好久了。
realloc 新分配一个块内存,然后把原来 s.base 指向的 stack_size 大小的内存拷贝到新分配的内存,所以 s.top 指向的地址也需要修改,让它指向在新分配的内存中的正确位置。
我以为就是在top指针之后增加内存呢?修改一下,试试看,多谢!
改了之后,确实没有问题了,多谢!