数据结构-链栈

一,链栈的组成

链栈:链式存放的栈。那么链栈的定义是什么样的呢?首先要思考栈和链表都关系,它们都有指针,栈是栈顶指针,链表是指针域。所谓栈顶指针不就是指向栈第一个元素(从上往下)的指针吗,和链表的头节点不是很像吗,所以用栈顶指针代替了头节点。它首先是个栈,就要有栈顶指针和计数值(普通栈的计数值是数据下标),那它怎么存放数据呢(普通栈通过数组存放),通过链表节点来存放数据,然后再通过把栈顶指针变成一个节点类型变量,这样栈的元素直接就能通过链表的指针联系在一起了。

首先是链栈节点的定义,和链表没有什么不一样,但是我们又定义了一个结构体,这个结构体相当于链栈名,里面声明了一个节点类型的栈顶变量,还有一个计数值,记录栈的大小。

二,链栈的常见操作

1.链栈的初始化(创建一个链栈)

  1. 先声明一个链栈
  2. 调用初始化函数
  3. 给栈顶节点分配内存
  4. 对链栈(栈顶节点)初始化

2.判断链栈是否为空

  1. 传入的参数是链栈结构体
  2. 使用结构体访问元素的方式. 访问count,如果是非0则说明链栈非空

3.链栈的进栈

  1. 因为链栈只能从栈顶节点进栈,所以不用判断进栈合法不
  2. 声明一个新节点并且分配内存
  3. 给新节点赋值
  4. 把新节点进栈即把新节点的指针域指向栈顶节点
  5. 栈顶节点向上移动
  6. 链栈中节点个数+1

4.链栈的出栈

  1. 栈的出栈也只能从栈顶出栈,也不用判断合法性
  2. 定义一个节点指针
  3. 取出栈顶节点数据域的值
  4. 把当前栈顶节点地址赋值给节点指针
  5. 栈顶节点可以进行后退(因为保存了原来要出栈的节点,那么栈顶节点就要指向下一个节点)
  6. 释放掉节点指针指向的原来的栈顶节点内存
  7. 链栈的节点数量-1

5.清空栈

  1. 声明一个节点指针(执行被释放的内存)
  2. 循环判断链表的栈顶节点是否存在
  3. 如果存在就使用节点指针指向栈顶节点
  4. 栈顶节点进行后退
  5. 释放原来栈顶节点内存
  6. 链栈节点个数-1
  7. 调用判断空栈函数,判断是否链栈为空

6.输出栈的内容

  1. 定义一个节点指针
  2. 节点指针指向栈顶节点的内存
  3. 使用循环从栈顶遍历到栈底
  4. 进行打印当前节点的数据域
  5. 指针后移

三,栈的类型

  1. 顺序栈:顺序栈和顺序表的共同点,使用连续的内存(数组),都有位置变量,只是叫法不同。顺序表叫表长,顺序栈叫栈顶,都可以说是使用内存的大小。不同点,当顺序栈没有元素是,栈顶是-1,顺序表没有元素是,表长是0;顺序栈进栈时,下标先自加(因为栈顶下标永远是有元素的),在赋值。出栈则是,先把值保存,下标在减一。
  2. 共享栈:和普通的顺序栈的不同点,多了一个栈顶下标。因为顺序栈的本质是数组,共享栈则是把一个数组划分成了俩部分,数组头是一个栈顶下标,数组尾也是一个栈顶下标。他的进栈和出栈操作和顺序表是一个原理,但是他有一个内存使用满的判断,如果某一个的栈顶下标+1=另外一个栈顶下标,就是栈满了。空的时候就是一个小标等于-1,一个下标等于数组的长度。
  3. 链栈

四,总结

学习栈,需要知道他的栈顶指针的作用,对栈操作永远是从栈顶开始,顺序栈的本质是数组,链栈的本质是链表。学习链栈,先要知道顺序栈的栈顶下标的含义,再结合链表进行融合。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值