#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100 //储存空间的初始分配 #define STACK_INCREMENT 10 //储存空间分配增量 typedef struct{ int *base; //栈底指针,在栈构造之前和销毁之后,base的值为NULL int *top; //栈顶指针 int stacksize; //当前分配的储存空间,以类型为单位,面可以储存的元素个数 }Stack; void Init_stack(Stack *s); //构造一个空栈 void Destroy_stack(Stack *s); //销毁 s栈,s栈不再存在 void Clear_stack(Stack *s); //将S置为空栈 int Stack_length(Stack *s); //返回S栈的元素,即栈的长度 int Get_top(Stack *s); //若栈不空,则返回s的栈顶元素 void Push_stack(Stack *s,int dat); // 插入元素dat为s栈的新元素 int Pop_stack(Stack *s); //删除s的栈顶元素,并返回删除的元素值 void Display_stack(Stack *s); //遍历s栈的每个元素 void Init_stack(Stack *s) //构造一个空栈 { (*s).base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); //申请一个栈的内存空间,初始地址就是栈底base if(!(*s).base) //储存分配失败则退出 { (*s).base=NULL; //防止野指针的出现 (*s).stacksize=0; //栈的大小 printf("栈初始化失败!!!"); exit(0); } (*s).top=(*s).base; //此时的栈是空栈,所以栈顶指针是栈底指针是相同的 //printf("base->%p\n",(*s).base); //用来查看栈顶,和栈底的地址,测试栈初始化情况 //printf("top ->%p\n",(*s).top); printf("栈初始化成功!!!\n"); } void Push_stack(Stack *s,int dat) //插入数据dat到s栈 { if((*s).top-(*s).base>=(*s).stacksize) { (*s).base=(int *)realloc((*s).base,sizeof(int)*((*s).stacksize+STACK_INCREMENT)); //如果栈满的话就调用realloc重新分配栈的大小 if(!(*s).base) { printf("栈扩充失败!!!"); exit(0); } (*s).stacksize+=STACK_INCREMENT; //如果扩充成功,记录元素个数的每次增长10 } (*s).top++; *(*s).top=dat;//dat数据进来栈顶top指针要上移 printf("top ->%p\n",(*s).top); printf("t->%d\n",*(*s).top); } int Pop_stack(Stack *s) //弹栈 { int dat; if((*s).top==(*s).base) { printf("这是一个空栈!!\n"); } dat=*(*s).top; //先把数据存到dat (*s).top--; //然后指针下移 //printf("弹栈:%p\n",(*s).top); return dat; } int Get_top(Stack *s) //返回栈顶的元素值 { int dat; if((*s).top==(*s).base) { printf("这是一个空栈!!\n"); } dat=*(*s).top; //先把数据存到dat printf("Get_top%p\n",(*s).top); return dat; } void Clear_stack(Stack *s) //清空栈 { (*s).top=(*s).base; if((*s).top==(*s).base) { printf("栈已经被清空!!\n"); } else { printf("栈没有被清空!!\n"); } } int Stack_length(Stack *s) //返回栈的长度 { return ((*s).top-(*s).base); } void Display_stack(Stack *s) //遍历栈并显示出里面的元素 { if((*s).top==(*s).base) { printf("这是一个空栈!!无法被遍历!!\n"); } int *tmp=(*s).base; do { printf("%d->%p\n",*tmp,tmp); tmp++; } while(tmp<=(*s).top); } void Destroy_stack(Stack *s) //销毁栈 { free((*s).base); //释放栈底(malloc出来的首地址) (*s).base=NULL; //防止野指针的出现 (*s).top=NULL; (*s).stacksize=0; if(!(*s).base) { printf("栈被销毁或释放!!!\n"); } } int main() { /* 函数直接调用 */ int i; Stack s; Init_stack(&s); for(i=0;i<=10;i++) //入栈 { Push_stack(&s,i); } printf("弹栈:%d\n", Pop_stack(&s)); //弹出栈顶的元素,并显示出来 ,这个栈顶元素被删除 printf("栈的长度:%d\n",Stack_length(&s)); //显示栈里面的元素个数 Display_stack(&s); //遍历栈里面的元素并显示出来 Clear_stack(&s); //清空栈 Destroy_stack(&s); //销毁栈(栈不使用时要释放占用的内存) return 0; }
C语言实现栈
猜你喜欢
转载自blog.csdn.net/qq1294272813/article/details/78091699
今日推荐
周排行