数据结构之线性表-栈的清空和销毁-学习笔记-31

引入

我们学习了栈的初始化、压栈、出栈,今天我们来看看如何清空和销毁一个栈。

清空栈

也就是将栈内的元素全部删除,但栈本身的物理空间,即内存地址是不会发生改变的。这个和销毁是有很大区别的。那么该如何清空呢?

  • 将 s->top 赋值为 s->base 即可,也就是让顶部和底部相等。
  • 可以这么理解,数据还在那,找数据的地址全没了。
  • 新数据写入的时候,会覆盖掉原来这个地址的数据。

代码实现

非常简单

1
2
3
ClaerStack( sqstack *s ){
s->top=s->base; //让顶部等于底部
}

销毁栈

销毁一个栈比较复杂

  • 找到当前存放了多少个数据
  • 逐个将这些数据的内存释放掉
  • 然后将顶部和底部都设置为 NULL
  • 最后将存储当前使用容量的 StackSize 也赋值为 0

代码实现

1
2
3
4
5
6
7
8
9
10
DestroyStack(sqStack *s){
int i , len; //设置两个用于循环的变量
len = s->stackSize; //len 获取的是当前栈中数据的个数
for(i=0;i<len;i++){ //有多少个数据循环多少次
free(s->base); //每次循环释放这个内存空间
s->base++; //然后指针向后移动
}
s->base=s->top=NULL; //接着将顶部和尾部都设置为NULL
s->stackSize=0; //把用于存放数据数量的 stackSize 也设置为0
}

思路其实很简单

  • 使用 for 循环,有多少数据循环多少次
  • 每次循环释放内存
  • 最后顶部、尾部都设置为 NULL
  • 别忘了把存储数据个数的 stackSize 也设为 0

计算栈的长度

这里简单说一下,前面讲 push 的时候,利用了栈顶-栈底的方法,判断是否为满栈。

1
2
3
if(s->top-s->base==s->stackSize){
printf("满栈!");
};

这里虽然是地址-地址,但是 C 语言返回的其实是除以 sizeof 之后的整数
也就是真正的两个地址之间,数据个数的差值。
利用这点,我们就可以计算栈的长度了。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!