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
此时,我们就会发现先输入数据的后输出了,我们的堆栈实现成功~
才疏学浅,难免有错误和不当之处,欢迎交流批评指正!