数据结构之顺序栈(C++版)
#include <iostream>
#include <stdlib.h>
#define MAXLISTSIZE 100 //预设的存储空间最大容量
using namespace std;
typedef string ElemType;
typedef struct{
ElemType *base; //存储空间基址
int top; //栈顶指针
int stacksize; //允许的最大存储空间以元素为单位
}Stack;
void InitStack(Stack &S);
void DestroyStack(Stack &S);
void Push(Stack &S);
void Pop(Stack &S);
void GetTop(Stack S);
void StackLength(Stack S);
void StackEmpty(Stack S);
int main(void)
{
Stack S;
int z;
cout << "+---------------------------+" << '\n';
cout << "|----------顺序栈-----------|" << '\n';
cout << "+---------------------------+" << '\n';
cout << "提示:为保证您的操作得到保存,请按正常顺序退出系统^_^" << '\n';
do
{
cout << '\n' << '\t' << '\t' << '\t' <<"--------------------------------" << '\n';
cout << '\t' << '\t' << '\t' <<"+ 主菜单 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+--------------------------------" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [1]----顺序栈初始化操作 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [2]----顺序栈的销毁操作 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [3]----顺序栈的入栈操作 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [4]----顺序栈的出栈操作 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [5]----顺序栈取栈顶元素 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [6]----顺序栈求栈长操作 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [7]----顺序栈的判空操作 |" << '\n';
cout << '\t' << '\t' << '\t' <<"+ [0]----退出系统 |" << '\n';
cout << '\t' << '\t' << '\t' <<"-----------------------------------" << '\n';
cout << "请输入您的选择:";
cin >> z;
switch(z)
{
case 0 : break;
case 1 : InitStack(S);break;
case 2 : DestroyStack(S);break;
case 3 : Push(S);break;
case 4 : Pop(S);break;
case 5 : GetTop(S);break;
case 6 : StackLength(S);break;
case 7 : StackEmpty(S);break;
default:cout << "无效选项!" << '\n';system("pause");
}
}
while(z!= 0);
}
void InitStack (Stack &S)
{
// 构造一个最大存储容量为 maxsize 的空栈 S
int maxsize;
cout << "请输入栈的最大储存容量:";
cin >> maxsize;
if (maxsize == 0)
maxsize = MAXLISTSIZE;
S.base = new ElemType[maxsize];
if (!S.base) exit(1); //存储分配失败
S.stacksize = maxsize;
S.top = 0; //空栈中元素个数为0
system("pause");
}
void Push(Stack &S)
{
ElemType e;
int j, n;
if (S.stacksize == 0)
{
cout << "栈已销毁或栈未初始化,请选择1初始化栈" << endl;
system("pause");
return;
}
if (S.top == S.stacksize)
{
cout << "栈已满,无法进行插入" << endl;
system("pause");
return;
}
cout << "请输入压入栈的元素个数(元素个数必须小于或等于" << S.stacksize - S.top << "):";
cin >> n;
cout << "请输入压入栈的元素:";
for(j = 0; j < n; j++)
{
cin >> e;
*(S.base + S.top) = e; // 插入新的元素
++S.top; // 栈顶指针后移
}
system("pause");
}
void Pop(Stack &S)
{
ElemType e;
int j, n;
if (S.stacksize == 0)
{
cout << "栈已销毁或栈未初始化,请选择1初始化栈" << endl;
system("pause");
return;
}
if (S.top == 0)
{
cout << "栈为空,无法出栈" << endl;
system("pause");
return;
}
cout << "请输入出栈的元素个数(出栈元素个数应小于或等于" << S.top << "):";
cin >> n;
cout << "出栈的元素为:";
for(j = 0; j < n; j++)
{
e = *(S.base + S.top-1); // 返回非空栈中栈顶元素
cout << e << ' ';
--S.top; // 栈顶指针前移
}
cout << endl;
system("pause");
}
void GetTop(Stack S)
{
ElemType e;
if (S.stacksize == 0)
{
cout << "栈已销毁或栈未初始化,请选择1初始化栈" << endl;
system("pause");
return;
}
if (S.top == 0)
{
cout << "栈为空,无法获取栈顶元素" << endl;
system("pause");
return;
}
e = *(S.base + S.top-1); // 返回非空栈中栈顶元素
cout << "栈顶元素为:" << e << endl;
system("pause");
}
void StackEmpty(Stack S)
{
if (S.stacksize == 0)
{
cout << "栈已销毁或栈未初始化,请选择1初始化栈" << endl;
system("pause");
return;
}
if(S.top == 0)
cout << "该顺序栈为空栈" << endl;
else
cout << "该顺序栈不为空栈" << endl;
system("pause");
}
void StackLength(Stack S)
{
if (S.stacksize == 0)
{
cout << "栈已销毁或栈未初始化,请选择1初始化栈" << endl;
system("pause");
return;
}
// 返回S的元素个数,即栈的长度
cout << "栈长为:" << S.top << endl;
system("pause");
}
void DestroyStack(Stack &S)
{
// 销毁栈S,S不再存在
if (S.stacksize == 0)
{
cout << "栈已销毁或栈未初始化,请选择1初始化栈" << endl;
system("pause");
return;
}
delete[] S.base;
S.top = 0;
S.stacksize = 0;
cout << "栈已销毁" << endl;
system("pause");
}