数据结构(8)栈结构之链栈

本文介绍了链栈的实现,包括无头结点的设计、链栈的初始化、入栈和出栈操作。在链栈初始化时,需要将头指针指向空以表示空栈状态。入栈操作涉及在链表头部插入新结点,而出栈则需要获取栈顶元素、更新栈顶指针并释放结点。完整代码包含在LinkStack.h、LinkStack.c和main.c文件中。
摘要由CSDN通过智能技术生成

前言

前面说过,栈的本质是操作受限的线性表,也就是说,当我们在实现链栈时,其实需要实现的是一个链表,只是相比一般的链表少了许多操作而已。既然它本质是链表,我们在设计结构的时候,就需要考虑是否设置头结点的问题,假如不设头结点,那么头指针指向的位置就是栈顶;假如设了头结点,那么头指针的next指针指向的结点(即首元结点)就是栈顶。本次采用的是无头结点的结构。

在这里插入图片描述

链栈的指针指向问题

链式存储离不开对地址的控制,因此想要掌握好链栈,需要对涉及的指针很了解。在链栈中(链表中也是一样),一般涉及到二重指针,如图所示。

在这里插入图片描述

C语言中有形参和实参的区别,假如我们想在函数里真正改变某个参数的值,就要传入该参数的地址。同理,假如想在函数中修改某个结点的值,那么就不能仅仅传入(StackNode)这个类型的值,而是需要传入这个值的地址(StackNode *)。假如在函数中想修改这个地址(StackNode *),那么就要再传入这个地址的地址,它是(StackNode **)类型的。

在链表中只需要一个头指针就可以找到整个链表,当链表为空时,头指针的指向为空,当链表非空时,它指向首元结点的地址。因此头指针设置为结点的指针类型(StackNode *),为了方便记录,又给(StackNode *)取名为(LinkStack),用来表示整个链表。这样,(StackNode **)又可以写成(LinkStack *)。

链栈的初始化

在主函数中,我们使用(LinkStack st)生成一个链栈,也就是生成了一个结点类型的指针变量。但是执行完该条语句之后,st的指向是混乱的。链栈的初始化就是将它的指向设置为空,表示当前是空栈。

在这里插入图片描述

//初始化链栈
void initStack(LinkStack *s){
   
    //将这个链栈初始化为空栈
    *s = NULL;
}

这时候,因为要修改的是头指针的指向(也就是值),而头指针是(LinkStack)类型的,因此需要传入的是头指针的地址(LInkStack *)。

链栈的入栈

链栈的入栈也就是链表的头部插入操作,它的操作可以大致分成两步:

1.申请一个结点并赋值
在这里插入图片描述
2.进行头部插入

在这里插入图片描述

链栈的出栈

链栈的出栈,也就是链表的头部删除,它的操作大致可以分成三步:

1.获取栈顶元素的值

2.栈顶指针指向栈顶元素的下一个结点

3.释放掉栈顶元素

在这里插入图片描述

全部代码

LinkStack.h

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值