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