【栈与队列】之栈的链式存储(图文详细介绍!!)

前言:本章基于《大话数据结构》和王卓老师的视频内容,为刚接触数据结构的初学者提供一些帮助。

💕如果我的文章对你有帮助,点赞、收藏、留言都是对我最大的动力

🐱‍👤我的上一篇文章:

【栈与队列】之栈的顺序存储(图文详细介绍!!)icon-default.png?t=M85Bhttps://blog.csdn.net/qq_62822533/article/details/128390607

目录

4.6  链式结构

4.7 栈的链式存储实现

4.8  栈的作用


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  栈的作用

   栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,更加聚焦于我们要解决的问题核心。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值