AC代码:
#include <iostream>
#define Status int
#define SElemType int
using namespace std;
// 链栈数据结构
typedef struct StackNode
{
SElemType data; // 数据域
struct StackNode *next; // 指针域
}StackNode, *LinkStack;
// *************************************基本操作函数*************************************//
// 初始化函数
Status InitStack(LinkStack &s)
{
s = NULL; // 生成空栈,以单链表表头为栈顶,链栈没有像链表类似的头结点
return 1;
}
// 入栈函数 将e压入栈
Status Push(LinkStack &s, SElemType e)
{
StackNode *p;
p = new StackNode; // 生成新结点
p->data = e; // 赋值
p->next = s; // 压入栈顶
s = p;
return 1;
}
// 出栈函数 栈顶出栈用e返回,主意释放空间
bool Pop(LinkStack &s, SElemType &e)
{
LinkStack p;
if(s==NULL)
return false; // 栈空
p = s;
e = s->data;
s = s->next;
free(p);
return true;
}
// 取栈顶函数 用e返回
bool GetTop(LinkStack &s, SElemType &e)
{
if(s==NULL)
return false; // 栈顶为空
e = s->data;
return true;
}
// ***************************************功能实现函数********************************//
// 菜单
void menu()
{
cout<<"********1.入栈 2.出栈"<<endl;
cout<<"********3.取栈顶 4.退出"<<endl;
}
// 入栈功能函数 调用Push函数
void PushToStack(LinkStack &s)
{
int n; SElemType e; bool flag;
cout<<"请输入入栈元素个数(>=1):"<<endl;
cin>>n;
for(int i = 0; i<n; i++)
{
cout<<"请输入第"<<i+1<<"个元素的值:"<<endl;
cin>>e;
flag = Push(s, e);
if(flag)
cout<<e<<"已入栈"<<endl;
}
}
// 出栈功能函数 调用Pop函数
void PopFromStack(LinkStack &s)
{
int n; SElemType e; bool flag;
cout<<"请输入出栈元素个数(>=1):"<<endl;
cin>>n;
for(int i = 0; i<n; i++)
{
flag = Pop(s, e);
if(flag)
cout<<e<<"已出栈"<<endl;
else
{
cout<<"该栈已空!";
break;
}
}
}
// 取栈顶功能函数 调用GetTop函数
void GetTopOfStack(LinkStack s)
{
SElemType e; bool flag;
flag = GetTop(s, e);
if(flag)
cout<<"栈顶元素为:"<<e<<endl;
else
cout<<"该栈已空!"<<endl;
}
int main()
{
LinkStack s;
int choice;
InitStack(s);
while(1)
{
menu();
cout<<"请输入菜单序号:"<<endl;
cin>>choice;
if(choice==4)
break;
switch(choice)
{
case 1 : PushToStack(s); break;
case 2 : PopFromStack(s); break;
case 3 : GetTopOfStack(s); break;
default : cout<<"输入错误!"<<endl;
}
}
return 0;
}