#include<stdio.h>
#include<malloc.h>
#define MAXSZIE 100
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); 	
}
posted on 2020-03-29 16:07  凸凸大军的一员  阅读(48)  评论(0编辑  收藏  举报