前言:本章基于《大话数据结构》和王卓老师的视频内容,为刚接触数据结构的初学者提供一些帮助。
💕如果我的文章对你有帮助,点赞、收藏、留言都是对我最大的动力
🐱👤我的上一篇文章:
【栈与队列】之栈的顺序存储(图文详细介绍!!)
https://blog.csdn.net/qq_62822533/article/details/128390607
目录
4.6 链式结构
链栈:是运算受限的单链表,只能在链表头部进行操作
typedef struct StackNode {
SElemType data;//数据域
struct StackNode* next;//指针域
}StackNode,*LinkStack;
4.7 栈的链式存储实现
链栈的初始化:
Status lnitStack(LinkStack& S)
{
//构造一个空栈,栈顶指针置空
S = NULL;
return OK;
}
判断链栈是否为空:
Status StackEmpty(LinkStack S)
{
if (S == NULL)return TRUE;
else
{
return FALSE;
}
}
链栈的入栈:
算法分析:假设元素e的新结点是s,S是栈顶指针
Status Push(LinkStack& S, SElemType e)
{
LinkStack p;
p = new StackNode;//生成新结点
p->data = e;//将新结点数据置为e
p->next = S;//将新结点插入栈顶,S是p的下一个结点(也就是当前的栈顶
S = p;//修改栈顶指针,把p变为栈顶指针
return OK;
}
链栈的出栈:
算法分析:假设变量p用来存储要删除的栈顶指针,将栈顶指针下移一位,最后释放p即可。
Status Pop(LinkStack& S, SElemType& e)
{
LinkStack p;
if (S == NULL)return ERROR;
e = S->data;//保留要删除结点的内容
p = S;//把要删除的结点的地址赋给p;
S = S->next;//把要删除的结点的下一个结点的地址赋值给S
delete p;//删除
return OK;
}
取栈顶元素:
SElemType GetTop(LinkStack S)
{
if (S != NULL)
return S->data;
}
注:关于链栈的其余操作,大家可以自己尝试着自己写出来,这样能够加强自己对这方面的理解。
完整代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define OK 1
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define ERROR 0
typedef int SElemType;
typedef int Status;
typedef struct StackNode {
SElemType data;//数据域
struct StackNode* next;//指针域
}StackNode,*LinkStack;
//链栈的初始化
Status lnitStack(LinkStack& S)
{
//构造一个空栈,栈顶指针置空
S = NULL;
return OK;
}
//判断链栈是否为空
Status StackEmpty(LinkStack S)
{
if (S == NULL)return TRUE;
else
{
return FALSE;
}
}
//链栈的入栈
Status Push(LinkStack& S, SElemType e)
{
LinkStack p;
p = new StackNode;//生成新结点
p->data = e;//将新结点数据置为e
p->next = S;//将新结点插入栈顶,S是p的下一个结点(也就是当前的栈顶
S = p;//修改栈顶指针,把p变为栈顶指针
return OK;
}
//链栈的出栈
Status Pop(LinkStack& S, SElemType& e)
{
LinkStack p;
if (S == NULL)return ERROR;
e = S->data;//保留要删除结点的内容
p = S;//把要删除的结点的地址赋给p;
S = S->next;//把要删除的结点的下一个结点的地址赋值给S
delete p;//删除
return OK;
}
Status printfLink(LinkStack S)
{
LinkStack p;
p = S;
while (p!= NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return OK;
}
//取栈顶元素
SElemType GetTop(LinkStack S)
{
if (S != NULL)
return S->data;
}
int main()
{
LinkStack S;
SElemType i, n, e;
scanf("%d", &n);
lnitStack(S);
for (int i = 0; i < n; i++)
{
scanf("%d", &e);
Push(S, e);
}
printfLink(S);
printf("%d\n", GetTop(S));
Pop(S, e);
printf("%d\n",e);
}
4.8 栈的作用
栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,更加聚焦于我们要解决的问题核心。