Fetch the repository succeeded.
#include <stdio.h>
#include <stdlib.h>
#define elemtype int
#define initcapacity 10
#define increment 10
typedef struct Stack{
elemtype *base;
elemtype *top;
int stacksize;
} Stack;
Stack* initStack(){
Stack *s=(Stack*)malloc(sizeof(Stack));
s->top=(elemtype*)malloc(sizeof(elemtype)*initcapacity);
s->base=s->top;
s->stacksize=initcapacity;
return s;
}
void destroyStack(Stack *s){ //这里有一个细节的问题,就是会有人问:为什么既然要销毁栈,为什么不直接free(s),然后s->NULL。
free(s->base); //这样不就将结构体中的东西释放掉了吗 ?
s->base=NULL; //这里其实有一个知识点,下面列举两个结构体(见代码末)
s->top=NULL;
s->stacksize=0; //所以在销毁栈时,是对结构体中的变量逐一free,然后将指针置空
} //再将容量置零
void clearStack(Stack *s){
s->top=s->base;
s->stacksize=0;
}
void pushStack(Stack *s,elemtype e){
if(s->top - s->base >= s->stacksize){
s->base=(elemtype*)realloc(s->base,sizeof(elemtype)*(initcapacity+increment));
if(!s->base){
printf("fail realloc\n");
exit(0);
}
s->top=s->base+s->stacksize;
s->stacksize+=increment;
}
if(!s->base){
printf("fail realloc\n");
exit(0);
}
*s->top=e;
s->top++;
}
void popStack(Stack *s){
if(s->top==s->base){
printf("stack is empty\n");
exit(0);
}
printf("pop-%d\n",*(--s->top));
}
int lengthStack(Stack *s){
return s->top - s->base;
}
elemtype GetTop(Stack *s){
return *(s->top-1); //时刻记住s->top,是一个指针,要取值的话,加*!!!
}
void traveraeStack(Stack *s){
if(s->base==s->top){
printf("Stack is empty!\n");
exit(0);
}
int len=lengthStack(s);
for(int i=1;i<=len;++i){
printf("%d->",*(s->top-i)); //这里在遍历的时候也有一个小细节
} //不能直接写*--(s->top)
printf("end\n"); //因为s是作为指针传入的,这样会修改结构体中top的值
} //遍历完后s-top就会等于s->base了
int main (){
Stack *s=initStack();
printf("%d\n",s->stacksize);
pushStack(s,1);
pushStack(s,2);
pushStack(s,3);
pushStack(s,4);
pushStack(s,5);
pushStack(s,6);
pushStack(s,7);
pushStack(s,8);
pushStack(s,9);
pushStack(s,10);
pushStack(s,11);
pushStack(s,12);
popStack(s);
printf("Stack length:%d\n",lengthStack(s));
printf("Top elem:%d\n",GetTop(s));
traveraeStack(s);
destroyStack(s);
}
/*
struct example{
char *home;
char name[10];
};
struct example{
char *home;
char *name;
};
这两个结构体的区别在于name的定义,前者是char型指针,后者是静态数组
我们可以测试一下,直接free掉结构体会有什么不同
*/
/*
realloc的用法:
*/
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。