引入
我们学习了栈的初始化、压栈、出栈,今天我们来看看如何清空和销毁一个栈。
清空栈
也就是将栈内的元素全部删除,但栈本身的物理空间,即内存地址是不会发生改变的。这个和销毁是有很大区别的。那么该如何清空呢?
- 将 s->top 赋值为 s->base 即可,也就是让顶部和底部相等。
- 可以这么理解,数据还在那,找数据的地址全没了。
- 新数据写入的时候,会覆盖掉原来这个地址的数据。
代码实现
非常简单1
2
3ClaerStack( sqstack *s ){
s->top=s->base; //让顶部等于底部
}
销毁栈
销毁一个栈比较复杂
- 找到当前存放了多少个数据
- 逐个将这些数据的内存释放掉
- 然后将顶部和底部都设置为 NULL
- 最后将存储当前使用容量的 StackSize 也赋值为 0
代码实现
1 | DestroyStack(sqStack *s){ |
思路其实很简单
- 使用 for 循环,有多少数据循环多少次
- 每次循环释放内存
- 最后顶部、尾部都设置为 NULL
- 别忘了把存储数据个数的 stackSize 也设为 0
计算栈的长度
这里简单说一下,前面讲 push 的时候,利用了栈顶-栈底的方法,判断是否为满栈。
1 | if(s->top-s->base==s->stackSize){ |
这里虽然是地址-地址,但是 C 语言返回的其实是除以 sizeof 之后的整数
也就是真正的两个地址之间,数据个数的差值。
利用这点,我们就可以计算栈的长度了。
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。