C++实现顺序栈

c++实现顺序栈中的基本操作:

1、顺序栈的初始化
2、顺序栈的入栈
3、顺序栈的出栈
4、顺序栈的取值
5、顺序栈的判空
6、顺序栈的求长
7、顺序栈的清空
8、顺序栈的销毁
9、顺序栈的打印

注意:执行销毁顺序栈操作后,给栈分配的内存空间会被回收,无法再执行顺序栈的基本操作,所以在调用销毁顺序栈后面添加了“return0;”,停止运行程序。

代码实现:

#include<iostream>
using namespace std;
#define SElemType int//SElemType类型可根据实际情况自行设定

//*******************************顺序栈的存储结构*******************************
#define Maxsize 100
typedef struct
{
	SElemType* base;//栈底指针
	SElemType* top;//栈顶指针
	int stacksize;//栈可用的最大容量
}SqStack;

//*****************************顺序表的基本操作函数*****************************

//顺序栈的初始化
int InitStack(SqStack& S)
{
	//构造一个空栈
	S.base = new SElemType[Maxsize];//为顺序栈动态分配一个最大容量为Maxsize的数组空间
	if (!S.base)
		exit(OVERFLOW);//存储分配失败
	S.top = S.base;//栈顶指针等于栈底指针
	S.stacksize = Maxsize;
	return 0;
}

//顺序栈的入栈
bool Push(SqStack& S, SElemType e)
{
	if (S.top - S.base == Maxsize)
		return false;//栈满
	*S.top++ = e;//相当于 S.top=e; top++;
	return true;
}

//顺序栈的出栈
bool Pop(SqStack& S,SElemType &e)
{
	if (S.top == S.base)
		return false;//栈空
	e = *--S.top;//相当于 --S.top; e=*S.top;
	return true;
}

//顺序栈的取值
bool GetTop(SqStack S, SElemType& e)
{
	if (S.top == S.base)
		return false;
	e = *(S.top - 1);
	return true;
}

//*********************************顺序表的基本功能函数******************************

//1、入栈
void PushSqStack(SqStack& S)
{
	SElemType e;
	bool flag;
	cout << "请输入入栈元素:" << endl;
	cin >> e;
	flag=Push(S, e);
	if (flag)
		cout << "入栈成功!" << endl;
	else
		cout << "栈满,入栈失败!" << endl;
}

//2、出栈
void PopSqStack(SqStack& S)
{
	SElemType e;
	bool flag;
	flag=Pop(S, e);
	if (flag)
		cout << "出栈元素为:" << e << endl;
	else
		cout << "栈空,出栈失败!" << endl;
}

//3、取值
void GetTopSqStack(SqStack S)
{
	SElemType e;
	bool flag;
	flag=GetTop(S, e);
	if (flag)
		cout << "取得的栈顶元素为:" << e << endl;
	else
		cout << "栈空,取栈顶元素失败!" << endl;
}

//4、判空
void StackEmpty(SqStack S)
{
	if (S.top == S.base)
		cout << "栈空!" << endl;
	else
		cout << "栈未空!" << endl;
}

//5、求长
void StackLength(SqStack S)
{
	cout << "顺序栈的长度为:" << S.top - S.base << endl;
}

//6、清空
void ClearStack(SqStack &S)
{
	if (S.base)
		S.top = S.base;
}

//7、销毁
void DestoryStack(SqStack& S)
{
	if (S.base)
	{
		delete[]S.base;
		S.stacksize = 0;
		S.top = S.base = NULL;
	}
}

//8、打印
void PrintStack(SqStack S)
{
	SElemType* p = S.base;
	for (int i = 1; i <= S.top - S.base; i++)
		cout << "第" << i << "个元素为:" << *p++ << endl;
}

//菜单
void menu()
{
	cout << "***************************************************************************" << endl;
	cout << "***********************************1、入栈*********************************" << endl;
	cout << "***********************************2、出栈*********************************" << endl;
	cout << "***********************************3、取值*********************************" << endl;
	cout << "***********************************4、判空*********************************" << endl;
	cout << "***********************************5、求长*********************************" << endl;
	cout << "***********************************6、清空*********************************" << endl;
	cout << "***********************************7、销毁*********************************" << endl;
	cout << "***********************************8、打印*********************************" << endl;
	cout << "***********************************0、退出*********************************" << endl;
	cout << "***************************************************************************" << endl;
}

int main()
{
	SqStack S;
	int select;
	InitStack(S);
	while (1)
	{
		system("CLS");//清屏操作
		menu();
		cout << "请输入菜单序号:" << endl;
		cin >> select;
		switch (select)
		{
		case 1://入栈
			PushSqStack(S);
			system("pause");//按任意键继续
			break;
		case 2://出栈
			PopSqStack(S);
			system("pause");
			break;
		case 3://取栈顶元素
			GetTopSqStack(S);
			system("pause");
			break;
		case 4://判定栈是否为空
			StackEmpty(S);
			system("pause");
			break;
		case 5://计算栈的长度
			StackLength(S);
			system("pause");
			break;
		case 6://清空栈
			ClearStack(S);
			system("pause");
			break;
		case 7://销毁栈,销毁后会自动退出
			DestoryStack(S);
			system("pause");
			return 0;
			break;
		case 8://从栈底到栈顶遍历栈并打印
			PrintStack(S);
			system("pause");
			break;
		case 0:
			cout << "欢迎下次使用!" << endl;//退出
			system("pause");
			return 0;
			break;
		default:
			cout << "菜单序号输入有误!" << endl;
			system("pause");
			break;
		}
	}
	system("pause");
	return 0;
}

参考资料:
《数据结构》(C语言版)严蔚敏
 数据结构与算法基础(青岛大学-王卓)_哔哩哔哩_bilibili

  • 5
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值