一.头文件部分
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 10 //顺序栈的最大存储空间
typedef int Status; //定义返回状态,方便阅读
typedef int numbre; //定义元素类型
typedef struct
{
numbre* base; //栈底指针
numbre* top; //栈顶指针
int length; //栈的最大长度
}sqstack;
在头文件部分,对栈的类型进行初始化定义
值得注意的是栈底指针可以不用定义,这时整个栈的操作将会与顺序表差不多。 - 注意文末
二.主函数部分
int main()
{
sqstack S; //定义栈
if (initstack(S) == OK) //初始化函数,并判断返回状态
cout << "栈创建成功!" << endl;
else cout << "栈创建失败!" << endl; //对返回状态进行判断,并给予反馈
menu(); //菜单函数
while (1) //在主循环里执行程序的选择,功能与菜单函数上所示对应
{
cout << "请输入选项:";
int c;
cin >> c; //对菜单进行选择操作
if (c == 1)
{
if (input(S) == ERROR) //入栈函数
cout << "进栈错误!" << endl;
else
cout << "进栈成功!" << endl;
}
else if (c == 2)
{
if (deletestack(S) == OK) //出栈函数
cout << "已出栈" << endl;
else
cout << "出栈失败!" << endl;
}
else if (c == 3) //返回当前栈顶元素
cout << "当前栈顶元素为:" << gettop(S) << endl;
else if (c == 4)
{
if (judgment(S) == OK) cout << "栈为空!" << endl;//判断栈是否为空
else
cout << "栈不为空!" << endl;
}
else
cout << "选项错误!" << endl;
}
return 0;
}
在主函数里对实现函数进行调用,并且判断实现函数是否,完成并反馈情况。
三.实现函数
(1)初始化
Status initstack(sqstack& S)
{
S.base = new numbre[MAXSIZE]; //空间分配
if (!S.base) return ERROR;
S.top = S.base;
S.length = MAXSIZE;
return OK;
}
在初始化函数中首先对S进行空间分配,然后对分配空间进行判断,如果分配成功继续操作,如果分配失败返回ERROR。成功后将top与base指向同一个栈点,并且设置栈的最大存储。
(2)入栈
Status input(sqstack& S)
{
int n, e;
cout << "请输入元素个数:";
cin >> n;
if (S.top - S.base == S.length) return ERROR;
if (n > S.length) return ERROR;
cout << "请输入元素:";
for (int i = 0; i < n; i++)
{
cin >> e;
//*S.top++ = e; //这个操作与下面两行实质上是一样的
*S.top=e; //从右开始运算
S.top++;
}
return OK;
}
在第一个if中判断当前栈是否为满,第二个if判断输入元素数量是否超出最大存储。进入循环开始将元素压入栈,并且向前移动栈顶指针。
(3)出栈
Status deletestack(sqstack& S)
{
if (S.top == S.base) return ERROR;
cout << *(S.top - 1); //输出出栈元素
S.top--; //栈顶指针后移
return OK;
}
将栈顶元素输出,然后将栈顶指针向后移动一位
(4)获取栈顶元素
numbre gettop(sqstack S)
{
if (S.top != S.base)
return *(S.top - 1);
return 0;
}
与删除操作类似,只是不对指针进行操作。
(5)判断栈是否为空
Status judgment(sqstack S)
{
if (S.top == S.base)
return OK;
return ERROR;
}
如果栈顶与栈底指针指向同一个位置,那么返回OK代表栈为空。
本篇文章为一次实验报告要求的内容,已经进行了运行测试。本人正在学习,如果有什么问题欢迎讨论斧正。(希望老师如果看到,能了解我的实验并不是在网上抄的啊)
F_NCIAE_A231_2022/3/16