C语言 简单易懂的链式存储栈表操作


栈详细定义请移步至 C语言 一分钟看懂的顺序存储栈表操作本文只讲解链表建栈以及操作

链式存储建栈的原理

我们都知道栈只能在一端进行操作,因此造成元素先进后出(First In Last Out),通常都是采用单链表的形式实现,并且规定所有的操作都在表头进行操作,因此我们才有头插法进行创建,建栈过程如图所示

在这里插入图片描述
链表建栈的有优点是便于多个栈共享存储空间,且不存在栈满上溢的情况

如果对你有帮助,点个赞呗

实现代码

结构体

typedef struct StckL
{
	char data;
	struct StckL* Next;

}StckL, *SL;

功能代码

初始化

SL InitStck(SL L)
{
/*
参数:链表首地址
函数功能:初始化链表
*/
	L = (SL)malloc(sizeof(StckL));
	if (L == NULL)
		return NULL;//初始化失败
	L->Next = NULL;
	return L;//初始化成功
	
}

判空

在顺序表存储的时候我们可以利用栈顶指针S.top来判断栈是否为空,但是在在链表中这个想法是不现实的,但是我们可以利用链表的长度来判断栈是否为空

int StckEmpty(SL L)
{

/*
参数:栈表首地址
函数功能:利用链表长度来判断栈是否为空
*/
	int i = -1;
	while (L != NULL)
	{
		L = L->Next;
		i++;//栈长度
	}
	return i;
}

出栈

SL Pop(SL L)
{
	/*
	参数:栈表首地址
	函数功能:删除栈顶元素-----出栈
	*/
	SL s;//指向待删除的结点
	if (StckEmpty(L) == 0)//表示栈为空
	{
		printf("栈为空,禁止操作\n");
		return NULL;
	}
	s = L->Next;//保存出栈信息
	L->Next = L->Next->Next;
	return s;
}

压栈

SL Push(SL L)
{
	/*
	参数:栈表首地址
	函数功能:元素利用头插法入栈----压栈
	*/
	SL s;
	SL p;//新结点
	char Ch;
	s = L;
	printf("请输入入栈的字符\n");
	scanf_s("%c", &Ch);
	getchar();
	p = (SL)malloc(sizeof(StckL));//申请结点
	p->data = Ch;
	p->Next = s->Next;//头插法入栈
	s->Next = p;
	return L;
}

获取栈顶元素

因为我们只需要获得栈顶元素,所以我们不需要对链表进行修改

SL GetElement(StckL *L)
{
	/*
	参数:栈的首地址
	函数功能:获得栈顶元素
	*/
	if (StckEmpty(L) == 0)
	{
		return NULL;//栈为空
	}
	return L->Next;//返回栈顶元素
}

欢迎大家在评论区赐教,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~搬~运~工~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值