C语言链表实现堆栈(0基础也能学会)

本文介绍了如何使用C语言通过链表实现堆栈,包括堆栈的入栈和出栈操作。堆栈遵循先入后出的原则,文中通过示例代码详细展示了如何构建堆栈,以及如何通过头节点获取并输出堆栈中的元素。代码中包含了一个完整的主函数,用于测试堆栈功能。读者可以跟随步骤,理解并实践C语言中链表堆栈的实现过程。
摘要由CSDN通过智能技术生成

 C语言用链表实现堆栈(详细版)小白专用

所谓堆栈就是先入后出(FILO)的一种数据结构,在递归函数,回溯算法等领域广泛应用。

首先,我们用链表实现堆栈,就需要建立一个堆栈链表的结构体。因为需要用到标准输入输出函数,同时需要申请动态空间,因此我们需要引入头文件,如下图所示。

#include<stdio.h>
#include<stdlib.h>
struct Snode
{
	int data;    //结点由数据构成
	struct Snode* Next;   //同时一个结点还包括指针域
};

前面基础准备工作做完后,我们就可以进行堆栈的构建

struct Snode* Push()
{
	struct Snode* s = malloc(sizeof(struct Snode));  //构建一个堆栈的头节点
	s->Next = NULL;                 //将堆栈的头节点指针域指向空
	int val = -1;                  //设置一个数字,作为输入结束的标志(当然这里val值随意设定)
	while (1)                      //下面进行循环入栈
	{
		scanf_s("%d", &val);                                     //输入一个值,令其存在val中
		if (val == -1)          //如果输入的值为-1则跳出循环
		{
			break;
		}
		struct Snode* TmpCell = malloc(sizeof(struct Snode));    //建立一个新的结点TmpCell
		TmpCell->data = val;                          //将输入的每一个值存入新建立的结点中
		TmpCell->Next = s->Next;               //为新的结点建立指针指向,即放入到堆栈里
		s->Next = TmpCell;                     //将头节点的下一项指向新结点
	}                              //以此为循环,建立新节点,pop如新结点,一个堆栈就这样构成了
	return s;                     //最后我们返回堆栈的头节点,就能获取到整个堆栈的全部信息

}

对于上面这段代码,做一下解释,上面这段代码,对于每建立一个新的结点,头结点的下一项都会指向这个新的结点,这样一来,我们一旦获取到头节点,就能得知后放入的元素,相当于先建立的结点,在后面;最后建立的结点紧靠着头节点,这样一来,我们在出栈的时候,只需要用到头节点,就能将全部栈内元素输出。

void Pop(struct Snode* s)   //出栈的时候,需要传入栈的头节点
{
	struct Snode* pCurrent = malloc(sizeof(struct Snode)); //设立一个辅助的结点pCurrent
	
	pCurrent = s->Next;    //令辅助指针指向头节点的下一项
	while (pCurrent != NULL)
                         //下面遍历取出栈内的元素,若pCurrent不等于空,说明没有到链表的最后一项
	{
		printf("%d ", pCurrent->data);    //打印输出,辅助结点对应的数值
		pCurrent = pCurrent->Next;        //每打印完后,辅助结点向后移动,读取下一个结点
	}

}

 当然,出栈以后可以加上free函数,释放结点占用的空间,这里就不再赘述了。

最后我们建立一个主函数,用来测试我们的堆栈

int main()
{
	printf("入栈:\n");
	struct Snode* s=Push();   //头节点的创建
	printf("出栈:\n");
	Pop(s);    //传入堆栈头结点
	return 0;
}

我们运行程序试试看!

 我们输入10 20 30 40 50 60 70 80 90 100然后输入终止的标志-1

此时,我们就会发现先输入数据的后输出了,我们的堆栈实现成功~

才疏学浅,难免有错误和不当之处,欢迎交流批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值