// 顺序栈的基本操作 #include "pch.h" #include #include using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 50 typedef int Status; // 返回状态 typedef char SElemType; // 元素类型 // 定义顺序栈结构体 struct SqStack { int stacksize; // 栈的最大容量 SElemType *base; // 栈底指针 SElemType *top; // 栈顶指针 }; // 初始化顺序栈 Status InitStack(SqStack &S) { S.base = new SElemType[MAXSIZE]; // 构造一个空栈 if (!S.base) { exit(OVERFLOW); // 内存分配失败 } S.top = S.base; // 设置为空栈 S.stacksize = MAXSIZE; // 设置栈的容量 return OK; } // 入栈 Status Push(SqStack &S, SElemType e) { // 插入元素,新插入的元素为栈顶 if (S.top - S.base == S.stacksize) { return ERROR; // 满栈返回错误 } *(S.top++) = e; // 元素入栈,栈顶指针+1 return OK; } // 出栈 Status Pop(SqStack &S,SElemType &e) { // 删除元素,栈顶指针同样向下移动一位 if (S.base == S.top) { return ERROR; // 空栈无法删除元素 } e = *(--S.top); // 栈顶指针-1,将当前指针的元素值传给e return OK; } // 获取顺序栈栈顶的元素 char GetTop(SqStack S) { if (S.top != S.base) // 判断是否为空栈 { return *(S.top - 1); } } int main() { SqStack S; int choose, flag = 0; SElemType j, e, t; cout << "1.初始化栈" << endl; cout << "2.入栈" << endl; cout << "3.读取栈顶元素" << endl; cout << "4.出栈" << endl; cout << "0.退出" << endl; choose = -1; while (choose != 0) { cout << "请输入选项0-4:"; cin >> choose; switch (choose) { case 1: if (InitStack(S)) { flag = 1; cout << "初始化成功!" << endl; } else { cout << "初始化失败!" << endl; } break; case 2: { fstream file; file.open("SqStack.txt"); if (!file) { cout << "文件打开失败!" << endl; exit(ERROR); } if (flag) { cout << "进栈元素依次为:"; while (!file.eof()) { file >> j; if (file.fail()) { break; } else { Push(S, j); cout << j << " "; } } cout << endl; } else { cout << "栈未创建,请重新输入!" << endl; } file.close(); break; } case 3: if (flag != -1 && flag != 0) { cout << "栈顶元素为:" << GetTop(S) << endl; } else { cout << "未初始化,栈内无元素!" << endl; } break; case 4: cout << "依次出栈元素为:"; while (Pop(S,t)) { flag = -1; cout << t << " "; } cout << endl; break; } } return 0; }