C++实现链栈

C++实现链栈中的基本操作:

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

链栈的特点:
链栈是运算受限的单链表,只能在链表头部进行操作;
链栈的头指针就是栈顶,不需要头结点,基本不存在栈满的情况;
空栈相当于头指针指向空,插入和删除仅在栈顶处执行。

代码实现:


//Date:2021/11/21
//链栈是运算受限的单链表,只能在链表头部进行操作
//链栈的头指针就是栈顶,不需要头结点,基本不存在栈满的情况
//空栈相当于头指针指向空,插入和删除仅在栈顶处执行

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

//*******************************链栈的存储结构******************************
typedef struct StackNode
{
	SElemType data;//结点的数据域
	struct StackNode* next;//结点的指针域
}StackNode, * LinkStack;//LinkStack为指向结构体StackNode的指针类型

//****************************链栈的基本操作函数*****************************

//链栈的初始化
void InitStack(LinkStack& S)
{
	//构造一个空栈,栈顶指针置空
	S = NULL;
}

//链栈的入栈
bool Push(LinkStack& S, SElemType e)
{
	//在栈顶插入元素e
	StackNode* p;
	p = new StackNode;
	p->data = e;
	p->next = S;
	S = p;//修改栈顶指针为p
	return true;
}

//链栈的出栈
bool Pop(LinkStack& S, SElemType &e)
{
	//删除栈顶元素,并用e返回其值
	if (S == NULL)
		return false;
	e = S->data;
	StackNode* p = S;//用p临时保存栈顶元素空间,以备释放
	S = S->next;
	delete p;//释放原栈顶元素空间
	return true;
}

//取栈顶元素
bool GetTop(LinkStack S, SElemType &e)
{
	//返回S的栈顶元素,不修改栈顶指针
	if (S == NULL)
		return false;//栈空,取值失败
	e = S->data;
	return true;
}

//*******************************链栈的基本功能函数****************************

//1、入栈
void Push(LinkStack& S)
{

	SElemType e;
	bool flag;
	cout << "请输入要入栈的元素:" << endl;
	cin >> e;
	flag = Push(S, e);
	if (flag)
		cout << "入栈成功!" << endl;
	else
		cout << "入栈失败!" << endl;
}

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

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

//4、判空
void StackEmpty(LinkStack S)
{
	if (S==NULL)
		cout << "链栈为空!" << endl;
	else
		cout << "链栈不为空!" << endl;
}

//5、求长
void StackLength(LinkStack S)
{
	int i = 0;
	while (S)//遍历链栈,统计结点数
	{
		i++;
		S = S->next;
	}
	cout << "链栈的长度为:" << i << endl;
}

//6、清空
void ClearStack(LinkStack &S)
{
	StackNode* p;
	while (S)//从栈顶开始,依次删除
	{
		p = S->next;
		delete S;
		S = p;
	}
}

//7、销毁
void DestroyStack(LinkStack& S)
{
	StackNode* p;
	while (S)//从栈顶开始,依次删除
	{
		p = S->next;
		delete S;
		S = p;
	}
	delete S;
}

//8、打印
void PrintStack(LinkStack S)
{
	int i=0;
	while (S)//遍历链栈
	{
		i++;
		cout << "链栈第" << i << "个数据为:" << S->data << endl;
		S = S->next;
	}
}

//菜单
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 << "***********************************9、退出*********************************" << endl;
	cout << "***************************************************************************" << endl;
}

int main()
{
	LinkStack S;
	InitStack(S);
	int select;
	while (1)
	{
		system("CLS");//清屏操作
		menu();
		cout << "请输入菜单序号:" << endl;
		cin >> select;
		switch (select)
		{
		case 1://入栈
			Push(S);
			system("pause");//按任意键继续
			break;
		case 2://出栈
			Pop(S);
			system("pause");
			break;
		case 3://取值
			GetTop(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://销毁
			DestroyStack(S);
			system("pause");
			return 0;
			break;
		case 8://打印
			PrintStack(S);
			system("pause");
			break;
		case 9:
			cout << "欢迎下次使用!" << endl;//退出
			system("pause");
			return 0;
			break;
		default:
			cout << "菜单序号输入有误!" << endl;
			system("pause");
			break;
		}
	}
	system("pause");
	return 0;
}

参考资料:《数据结构》(C语言版)严蔚敏

  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值