1 Star 0 Fork 0

陈旭文/数据结构代码

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
栈(清华第三版) 2.88 KB
一键复制 编辑 原始数据 按行查看 历史
陈旭文 提交于 2024-09-23 19:15 +08:00 . 栈(清华第三版).
#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的用法:
*/
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/CoderChenXW/data-structure-code.git
git@gitee.com:CoderChenXW/data-structure-code.git
CoderChenXW
data-structure-code
数据结构代码
master

搜索帮助