#include<stdio.h>
#include<malloc.h>
#define
typedef int ElemType;
typedef struct SqStack{
ElemType *top;
ElemType *base;
int sizestack;
}SqStack; //接口
SqStack *InitStack(SqStack &s)//初始化创建空栈
{
s.base=(int*)malloc(sizeof(int)*MAXSZIE);
if(!s.base)
return 0;
s.top=s.base;
s.sizestack=MAXSZIE;
return 0;
}
void pushStack(SqStack &s)//压栈
{
int e;
scanf("%d",&e);
if(s.top-s.base==s.sizestack)
printf("内存已满,无法继续压栈!");
else
*s.top++=e; //先压栈,再使top指针上移
}
void DisplayStack(SqStack &s) //遍历栈
{
if(s.base==s.top)
printf("栈空!");
int *p;
p=s.top;
while(p>s.base)
{
p--;
printf("%d->",*p);
}
}
int popStack(SqStack &s,ElemType &e) //出栈
{
if(s.base==s.top)
{
printf("栈已空!");
}
e=*(--s.top); //先使top指针下移,再弹栈;
return e;
}
void CleanStack(SqStack &s)//清空栈
{
if(s.base==s.top)
printf("栈已空!");
s.base=s.top;
}
void destory_stack(SqStack &s)//销毁栈
{
if(s.base)
{
free(s.base);
s.base=NULL;
s.top=NULL;
s.sizestack=0;
}
}
int GetTop(SqStack s,ElemType &e) //得到栈顶元素,注意这里s前没有添加引用,该处为值传递,不是引用传递,为了对main方法中的top指针不进行变动
{
if(s.base==s.top)
printf("栈已空!");
e=*(--s.top);
return e;
}
int StackEmpty(SqStack s)//判断栈是否清空
{
if(s.base==s.top)
return 1;
else
return 0;
}
int main()
{
SqStack s;
InitStack(s);
int n;
printf("你要输入多少数据:");
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
printf("请输入第%d个压栈数据:",i);
pushStack(s);
}
printf("该栈顶元素为:");
int v;
GetTop(s,v);
printf("%d",v);
printf("\n");
int x,y;
printf("请输入出栈数据个数:");
scanf("%d",&x);
for(int i=1;i<=x;i++)
{
popStack(s,y);
printf("%d->",y);
}
printf("\n");
printf("余下数据如下\n");
DisplayStack(s);
CleanStack(s);
printf("\n清栈后,栈空否:%d(1:空 0:否)",StackEmpty(s));
destory_stack(s);
}