1 Star 0 Fork 0

陈旭文/数据结构代码

Create your Gitee Account
Explore and code with more than 13.5 million developers,Free private repositories !:)
Sign up
文件
This repository doesn't specify license. Please pay attention to the specific project description and its upstream code dependency when using it.
Clone or Download
栈(清华第三版) 2.88 KB
Copy Edit Raw Blame History
陈旭文 authored 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

Search