C++实现链栈的算法+步骤(附全代码):
使用c++完成数据结构链栈的基本操作,包括(初始化、入栈、出栈、取栈顶元素、遍历输出栈等),可直接编译运行。
链栈
是指采用链式存储结构实现的栈,通常用单链表来表示。它的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续也可以是不连续)。
而顺序栈
是用顺序存储结构实现的栈,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。
链栈的定义:
#define MAXSIZE 100
typedef int SElemType;
typedef int Status;
//链栈的存储结构
typedef struct StackNode
{
SElemType data;
struct StackNode* next;
}StackNode, * LinkStack;
链栈的初始化:
【算法步骤】
构造一个空栈即可。
【算法描述】
//链栈的初始化
Status InitStack(LinkStack& S)
{ //构造一个空栈S,栈顶指针置空
S = NULL;
return OK;
}
链栈的入栈:
【算法步骤】
①为入栈元素e分配空间,用指针p指向。
②将新结点数据域置为e。
③将新结点插入栈顶。
④修改栈顶指针为p。
【算法描述】
//链栈的入栈
Status Push(LinkStack& S, SElemType e)
{ //在栈顶插入元素e,链栈不需要判断栈满
StackNode* p = new StackNode;
p->data = e;
p->next = S;
S = p;
return OK;
}
链栈的出栈:
【算法步骤】
①判断栈是否为空,若空则返回ERROR。
②将栈顶元素赋给e。
③临时保存栈顶元素的空间,以备释放。
④修改栈顶指针,指向新的栈顶元素。
⑤释放原栈顶元素的空间
【算法描述】
//链栈的出栈
Status Pop(LinkStack& S, SElemType& e)
{ //删除S的栈顶元素,用e返回其值
if (S == NULL) //判断是否为栈空
return ERROR;
e = S->data;
StackNode* p = S;
S = S->next;
delete p;
return OK;
}
取栈顶元素:
【算法步骤】
① 判断栈是否空,若空则返回ERROR。
② 返回e获取栈顶元素的值。
【算法描述】
//取链栈的栈顶元素
SElemType GetTop(LinkStack S, SElemType &e)
{ //返回S的栈顶元素,不修改栈顶指针
if (S != NULL) //非栈空时返回
return S->data;
return ERROR;
}
遍历输出顺序栈:
【算法步骤】
① 判断栈是否空,若空则返回ERROR。
② 循环输出栈顶元素。
【算法描述】
//遍历输出链栈
Status StackTraverse(LinkStack S)
{
StackNode* p = S;
if (p == NULL)
{
cout << "链栈为空!" << endl;
return ERROR;
}
cout << "栈顶->";
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
return OK;
}
全代码如下:
//链栈的基本操作.cpp
#include<iostream>
using namespace std;
#define ERROR 0
#define OK 1
#define MAXSIZE 100
typedef int SElemType;
typedef int Status;
//链栈的存储结构
typedef struct StackNode
{
SElemType data;
struct StackNode* next;
}StackNode, * LinkStack;
Status InitStack(LinkStack&); //空栈
Status Push(LinkStack&, SElemType); //入栈
Status Pop(LinkStack&, SElemType&); //出栈
Status GetTop(LinkStack, SElemType&); //读栈顶元素
Status StackTraverse(LinkStack); //遍历
int main()
{
LinkStack S;
int e, a;
if (InitStack(S))
cout << "链栈初始化成功!" << endl;
else
cout << "链栈初始化失败!" << endl;
while (1)
{
cout << "\n【1】入栈 【2】出栈 【3】读栈顶元素 【4】输出栈 【0】退出" << endl;
cout << "请选择要进行的操作:";
cin >> a;
switch (a)
{
case 1:
cout << "请输入入栈元素:";
cin >> e;
if (!Push(S, e))
cout << "入栈失败!" << endl;
else
cout << "元素" << e << "入栈成功!" << endl;
break;
case 2:
if (!Pop(S, e))
cout << "出栈失败!" << endl;
else
cout << "元素" << e << "出栈成功!" << endl;
break;
case 3:
if (!GetTop(S, e))
cout << "读栈顶元素失败!" << endl;
else
cout << "栈顶元素为:" << e << endl;
break;
case 4:
StackTraverse(S);
break;
case 0: return OK;
default:
return OK;
}
}
return 0;
}
//链栈的初始化
Status InitStack(LinkStack& S)
{ //构造一个空栈S,栈顶指针置空
S = NULL;
return OK;
}
//链栈的入栈
Status Push(LinkStack& S, SElemType e)
{ //在栈顶插入元素e,链栈不需要判断栈满
StackNode* p = new StackNode;
p->data = e;
p->next = S;
S = p;
return OK;
}
//链栈的出栈
Status Pop(LinkStack& S, SElemType& e)
{ //删除S的栈顶元素,用e返回其值
if (S == NULL) //判断是否为栈空
return ERROR;
e = S->data;
StackNode* p = S;
S = S->next;
delete p;
return OK;
}
//取链栈的栈顶元素
SElemType GetTop(LinkStack S, SElemType &e)
{ //返回S的栈顶元素,不修改栈顶指针
if (S != NULL) //非栈空时返回
return S->data;
return ERROR;
}
//遍历输出链栈
Status StackTraverse(LinkStack S)
{
StackNode* p = S;
if (p == NULL)
{
cout << "链栈为空!" << endl;
return ERROR;
}
cout << "栈顶->";
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
return OK;
}
运行结果:
美美地完成!