AC代码:
#include <iostream>
#define Status int
#define SElemType int
#define MaxSize 3
using namespace std;
// 栈数据结构
typedef struct Stack
{
SElemType *base; // 栈底指针 不变
SElemType *top; // 栈顶指针 一直在栈顶元素的上一个位置
int stacksize; // 栈可用的最大容量
}SqStack;
// **************************************基本操作函数*****************************************//
// 初始化函数
Status InitStack(SqStack &s)
{
s.base = new SElemType[MaxSize];
if(!s.base)
{
cout<<"空间分配失败"<<endl;
return 0;
}
s.top = s.base; // 将栈顶指针初始化为与栈底指针相同,即初始化为空栈;
s.stacksize = MaxSize;
return 1;
}
// 入栈
Status Push(SqStack &s, SElemType e)
{
if(s.top - s.base == s.stacksize) // 栈满
return 0;
*(s.top++) = e; // 先入栈,再修改栈顶指针
return 1;
}
// 出栈
Status Pop(SqStack &s, SElemType &e)
{
if(s.top == s.base)
return 0;
e = *(--s.top); // 先修改栈顶指针,再出栈
return 1;
}
// 取栈顶元素,不修改指针
bool GetTop(SqStack s, SElemType &e) // 传参为传值,形参修改不影响实参;
{
if(s.top == s.base) // 栈空
return false;
else
e = *(--s.top); // --s.top修改的是形参,不会修改真正的栈顶指针
return true;
}
// **************************************功能实现函数************************************//
// 菜单
void menu()
{
cout<<"********1.入栈 2.出栈********"<<endl;
cout<<"********3.取栈顶 4.退出********"<<endl;
}
// 入栈功能函数 调用Push函数
void PushToStack(SqStack &s)
{
int n; SElemType e; int 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;
else
cout<<"该栈已满!"<<endl;
}
}
// 出栈功能函数 调用Pop函数
void PopFromStack(SqStack &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<<"该栈已空!"<<endl;
}
}
// 取栈顶功能函数 调用GetTop函数
void GetTopOfStack(SqStack &s)
{
SElemType e; bool flag;
flag = GetTop(s, e);
if(flag)
cout<<"栈顶元素为:"<<e<<endl;
else
cout<<"该栈已空!"<<endl;
}
int main()
{
SqStack 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;
}