C语言实现栈

#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;

}


猜你喜欢

转载自blog.csdn.net/qq1294272813/article/details/78091699