AC代码:
#include <iostream>
#define Status int
#define SElemType int
#define MaxSize 3
using namespace std;
// 双栈数据结构
typedef struct
{
SElemType *V; // 栈数组的基地址
SElemType *top[2]; // 栈顶指针
SElemType *bot[2]; // 栈底指针
int m; // 栈可用最大容量
}DblStack;
// 初始化函数
Status InitStack(DblStack &s)
{
s.V = new SElemType[MaxSize]; // 申请一块儿空间
if(!s.V)
{
cout<<"空间分配失败"<<endl;
return 0;
}
s.m = MaxSize; // m代表了栈数组的最大长度,后续出现的s.m其实与MaxSize等价
s.top[0] = s.bot[0] = s.V; // top[0]始终指向栈顶元素的下一个位置
// 初始化时,top[0]和]bot[0]指向V[0]的位置;
s.top[1] = s.bot[1] = &s.V[s.m]; // top[1]始终指向栈顶元素的当前位置
// top[1]和bot[1]指向V[MaxSize]的位置
}
// 入栈函数
Status Push(DblStack &s, SElemType e, int stackNumber)
{
if(s.top[0]==s.top[1]) // 判断栈满的条件;
{
return 0;
}
if(stackNumber==0)
{
*(s.top[0]++) = e; //栈0有元素进栈,先进栈,再修改栈顶指针;
}
else if(stackNumber==1)
{
*(--s.top[1]) = e; // 栈1有元素进栈,先修改栈顶指针,再进栈;
}
return 1;
}
// 出栈函数
Status Pop(DblStack &s, SElemType &e, int stackNumber)
{
if(stackNumber==0)
{
if(*(s.top[0])==-1) // 判断栈空的条件
{
return 0;
}
e = *(--s.top[0]);
return 1;
}
else if(stackNumber==1)
{
if(s.top[1]==s.bot[1]) // 判断栈空的条件
{
cout<<"该栈已空!"<<endl;
return 0;
}
e = *(s.top[1]++);
return 1;
}
}
// 入栈功能函数 调用Push函数
void PushToStack(DblStack &s)
{
int n; SElemType e; int flag; int stackNumber;
cout<<"请输入入栈元素个数(>=1)和栈的序号(0或1):"<<endl;
cin>>n>>stackNumber;
for(int i = 0; i<n; i++)
{
cout<<"请输入第"<<i+1<<"个元素的值:"<<endl;
cin>>e;
flag = Push(s, e, stackNumber);
if(flag)
cout<<"元素"<<e<<"已入栈!"<<endl;
else
cout<<"该栈已满!"<<endl;
}
}
// 出栈功能函数 调用Pop函数
void PopFromStack(DblStack &s)
{
int n; SElemType e; int flag; int stackNumber;
cout<<"请输入出栈元素个数(>=1)和栈的序号:"<<endl;
cin>>n>>stackNumber;
for(int i = 0; i<n; i++)
{
flag = Pop(s, e, stackNumber);
if(flag)
cout<<"元素"<<e<<"已出栈!"<<endl;
else
cout<<"该栈已空!"<<endl;
}
}
void menu()
{
cout<<"********1.入栈 2.出栈********"<<endl;
cout<<"********3.退出 ********"<<endl;
}
int main()
{
DblStack s;
int choice;
InitStack(s);
while(1)
{
menu();
cout<<"请输入菜单序号:"<<endl;
cin>>choice;
if(choice == 3)
break;
switch(choice)
{
case 1: PushToStack(s); break;
case 2: PopFromStack(s); break;
default : cout<<"输入错误!"<<endl;
}
}
}