一,链栈的组成
链栈:链式存放的栈。那么链栈的定义是什么样的呢?首先要思考栈和链表都关系,它们都有指针,栈是栈顶指针,链表是指针域。所谓栈顶指针不就是指向栈第一个元素(从上往下)的指针吗,和链表的头节点不是很像吗,所以用栈顶指针代替了头节点。它首先是个栈,就要有栈顶指针和计数值(普通栈的计数值是数据下标),那它怎么存放数据呢(普通栈通过数组存放),通过链表节点来存放数据,然后再通过把栈顶指针变成一个节点类型变量,这样栈的元素直接就能通过链表的指针联系在一起了。
首先是链栈节点的定义,和链表没有什么不一样,但是我们又定义了一个结构体,这个结构体相当于链栈名,里面声明了一个节点类型的栈顶变量,还有一个计数值,记录栈的大小。
二,链栈的常见操作
1.链栈的初始化(创建一个链栈)
- 先声明一个链栈
- 调用初始化函数
- 给栈顶节点分配内存
- 对链栈(栈顶节点)初始化
2.判断链栈是否为空
- 传入的参数是链栈结构体
- 使用结构体访问元素的方式. 访问count,如果是非0则说明链栈非空
3.链栈的进栈
- 因为链栈只能从栈顶节点进栈,所以不用判断进栈合法不
- 声明一个新节点并且分配内存
- 给新节点赋值
- 把新节点进栈即把新节点的指针域指向栈顶节点
- 栈顶节点向上移动
- 链栈中节点个数+1
4.链栈的出栈
- 栈的出栈也只能从栈顶出栈,也不用判断合法性
- 定义一个节点指针
- 取出栈顶节点数据域的值
- 把当前栈顶节点地址赋值给节点指针
- 栈顶节点可以进行后退(因为保存了原来要出栈的节点,那么栈顶节点就要指向下一个节点)
- 释放掉节点指针指向的原来的栈顶节点内存
- 链栈的节点数量-1
5.清空栈
- 声明一个节点指针(执行被释放的内存)
- 循环判断链表的栈顶节点是否存在
- 如果存在就使用节点指针指向栈顶节点
- 栈顶节点进行后退
- 释放原来栈顶节点内存
- 链栈节点个数-1
- 调用判断空栈函数,判断是否链栈为空
6.输出栈的内容
- 定义一个节点指针
- 节点指针指向栈顶节点的内存
- 使用循环从栈顶遍历到栈底
- 进行打印当前节点的数据域
- 指针后移
三,栈的类型
- 顺序栈:顺序栈和顺序表的共同点,使用连续的内存(数组),都有位置变量,只是叫法不同。顺序表叫表长,顺序栈叫栈顶,都可以说是使用内存的大小。不同点,当顺序栈没有元素是,栈顶是-1,顺序表没有元素是,表长是0;顺序栈进栈时,下标先自加(因为栈顶下标永远是有元素的),在赋值。出栈则是,先把值保存,下标在减一。
- 共享栈:和普通的顺序栈的不同点,多了一个栈顶下标。因为顺序栈的本质是数组,共享栈则是把一个数组划分成了俩部分,数组头是一个栈顶下标,数组尾也是一个栈顶下标。他的进栈和出栈操作和顺序表是一个原理,但是他有一个内存使用满的判断,如果某一个的栈顶下标+1=另外一个栈顶下标,就是栈满了。空的时候就是一个小标等于-1,一个下标等于数组的长度。
- 链栈
四,总结
学习栈,需要知道他的栈顶指针的作用,对栈操作永远是从栈顶开始,顺序栈的本质是数组,链栈的本质是链表。学习链栈,先要知道顺序栈的栈顶下标的含义,再结合链表进行融合。