// 顺序栈的基本操作
#include <iostream>
#include <fstream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 50 // 存储空间的初始分配数量
typedef int Status; // 返回函数状态值
typedef char SElemType; // 元素类型
typedef struct {
int stacksize; // 栈可用的最大容量
SElemType *base; // 栈底指针
SElemType *top; // 栈顶指针
}SqStack;
// 初始化顺序栈
Status InitStack(SqStack &S) {
//构造一个空栈S
// 为顺序栈动态分配一个最大容量为MAXSIZE数组空间
S.base = new SElemType[MAXSIZE];
if (!S.base) // 存储空间分配失败
exit(OVERFLOW);
S.top = S.base; // 将栈顶指针指向栈底,空栈
S.stacksize = MAXSIZE; // 设置栈的最大容量MAXSIZE
return OK;
}
// 入栈
Status Push(SqStack &S, SElemType e) {
// 插入元素e为新的栈的顶元素
if (S.top - S.base == S.stacksize) // 栈满
return ERROR;
*(S.top++) = e; // 元素e压入栈顶,栈顶指针加1
return OK;
}
// 出栈
Status Pop(SqStack &S, SElemType &e) {
// 删除S的栈顶元素,用e返回你要删除其值
if (S.base == S.top) // 栈空
return ERROR;
e = *(--S.top); // 栈顶指针减1,将栈顶元素赋给e
return OK;
}
// 获取顺序栈的栈顶元素
char GetTop(SqStack S) { // 返回S的栈顶元素,不修改栈顶指针
if (S.top != S.base) // 栈非空
return *(S.top - 1); // 返回栈顶元素的值,栈顶指针不变
}
int main()
{
SqStack S;
int choose, flag = 0;
SElemType j, e, t;
cout << "1.初始化栈 2.入栈 3.读取栈顶元素 4.出栈 0.退出\n\n";
choose = -1;
while (choose != 0) {
cout << "\n请选择0-4项:";
cin >> choose;
switch (choose)
{
case 1:
if (InitStack(S)) {
flag = 1;
cout << "顺序栈已初始化成功.\n";
}
else
cout << "顺序栈已初始化失败.\n";
break;
case 2:
{
fstream file;
file.open("SqStack.txt");
if (!file) {
cout << "打开失败,请重新检查\n\n";
exit(ERROR);
}
if (flag) {
cout << "进栈元素依次为:\n";
while (!file.eof()) {
file >> j;
if (file.fail())
break;
else
{
Push(S, j);
cout << j << " ";
}
}
cout << "\n\n";
}
else
{
cout << "栈未创建,请重新选择\n\n";
}
file.close();
}
break;
case 3:
if (flag != -1 && flag != 0)
cout << "栈顶元素为:" << GetTop(S) << endl << endl;
else
cout << "栈中无此元素,请重新选择:\n\n\n\n";
break;
case 4:
cout << "依次出栈元素为:\n";
while (Pop(S, t)) {
flag = -1;
cout << t << " ";
}
cout << endl;
break;
}
}
return 0;
}