0
点赞
收藏
分享

微信扫一扫

数据结构:实验顺序栈的实现与入栈,出栈,查看栈顶元素,判断栈是否为空等基本操作的实现(c/c++版)

西曲风 2022-03-16 阅读 78

一.头文件部分

#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

举报

相关推荐

0 条评论