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语言版)严蔚敏