#include<stdio.h>
#include<stdlib.h>

#define MAXLEN 100

typedef int datatype;
typedef struct{
	datatype data[MAXLEN];
	int top;
}stack;//栈结构体 

//初始化栈 
void init_stack(stack *s)
{
	s->top = -1;//top为-1表示栈空 
}

//判断栈是否为空 
//空返回1，否则0 
int empty_stack(stack *s)
{
	if(s->top == -1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

//判断栈是否为满
//满返回1，否则0 
int full_stack(stack *s)
{
	if(s->top == MAXLEN-1) 
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

//进栈 
//成功返回1，否则0 
int push(stack *s, datatype x)
{
	if(full_stack(s))
	{
		printf("栈满！\n");
		return 0;
	}
	else
	{
		s->top++;
		s->data[s->top] = x;
		return 1;
	}
}


//出栈 
//成功返回1，否则0 
int pop(stack *s, datatype *x)
{
	if(empty_stack(s))
	{
		printf("栈空！\n");
		return 0;
	}
	else
	{
		*x = s->data[s->top];
		s->top--;
		return 1;
	}
}

//取栈顶元素 
int get_top(stack *s, datatype *x)
{
	if(empty_stack(s))
	{
		printf("栈空！\n");
		return 0;
	}
	else
	{
		*x = s->data[s->top];
		return 1;
	}
}

//输出栈 
void output(stack s)
{
	for(int i = 0; i <= s.top; i++)
	{
		printf("%d\t",s.data[i]);
	}
	printf("\n输出完成\n");
}

int main()
{
	stack a;
	init_stack(&a);
	int tmp = 0;
	printf("1.进栈\n"
	       "2.出栈\n"
	       "3.显示栈顶元素\n"
	       "4.输出栈\n");
	char b;
	while(1)
	{
		scanf("%c",&b);
		switch(b)
		{
			case '1':
				printf("\n输入需要插入的数字\n");
				scanf("%d",&tmp); 
				if(push(&a,tmp))
				{
					printf("操作成功\n");
				}
				break;
			case '2':
				if(pop(&a,&tmp))
				{
					printf("数字%d从栈中移除\n",tmp);
					printf("操作成功\n");
				}
				break;
			case '3':
				if(get_top(&a,&tmp))
				{
					printf("栈顶元素为%d\n",tmp);
					printf("操作成功\n");
				}
				break;
			case '4':
				output(a);
				break;
		}
	}
}
