#include<iostream>
#include<stdlib.h>
using namespace std;


//栈的链式结构表示
typedef struct StackNode
{
char data;
struct StackNode *next;
} *LinkStack;


//1.构建一个空栈
void InitStack(LinkStack &S)
{
S = NULL;
}


//2.判断栈是否为空
bool StackEmpty(LinkStack &S)
{
if (S == NULL)
return true;
else
return false;
}


//3.取栈顶元素
char GetTop(LinkStack &S)
{
if (S==NULL){
cout<<"栈已为空";
exit(0);
}
else
return S->data;
}

//4.栈顶插入元素
int Push(LinkStack &S, char &e)
{
StackNode *p = new StackNode;
p->data=e;
p->next=S;
S=p;
return 1;
}

//5.删除栈顶元素
int Pop(LinkStack &S, char &e)
{
if (S == NULL)
return 0;
e = S->data;
StackNode *p = new StackNode;
p=S;
S=S->next;
delete p;
return 1;
}

//6.栈的遍历
void StackTraverse(LinkStack &S)
{
StackNode *p = S;
while (p != NULL)
{
cout<<p->data;
p=p->next;
}
delete p;
}




//主函数检验九种操作
int main()
{
LinkStack S;
char e;int i,n ;

InitStack(S);

cout<<"输入栈的长度:";
cin>>n;
cout<<"输入栈的元素:";
for (i = 1; i <= n; i++)
{
cin>>e;
Push(S,e);
}


cout<<"遍历输出栈中的所有元素:";
StackTraverse(S);



cout<<endl<<"请输入要插入的元素的数值:";
cin>>e;
Push(S,e);


cout<<"栈顶元素是:"<<GetTop(S)<<endl;


cout << "依次弹出的队头元素为:";
while (Pop(S, e)) {
cout << e << " ";
}



if (StackEmpty(S))
cout<<endl<<"栈为空";
else
cout<<endl<<"栈非空";



return 0;
}