关于C语言中栈操作的一个大疑问???

linuxblack125125 2012-08-01 12:19:59
int Pop(SqStack *S,StkType *ch)
{
if(S->top == S->base)
return 0;
--S->top;
*ch=*S->top;
return 1;
}


这是出栈的源码----《数据结构(C语言版)》

作用是若栈不为空,就删除S的栈顶元素,但是这里它只是将top指针往下移了一步,并没有起到删除栈顶元素的作用,如果此时再将S->top++,同样可以再访问到原来的数据。

请各位大侠们说说这个怎么回事?
...全文
296 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
linuxblack125125 2012-08-02
  • 打赏
  • 举报
回复
感谢各位了,我会把你们的回答整理一下,放到博客中。现在我就把这个贴子结了。真心感谢各位的回答了。。。
linuxblack125125 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

空、0、被free的内存、……,它们也是客观存在的值;而不是虚无。
[/Quote]

有点哲学的味道,受教了。。。哈哈
赵4老师 2012-08-01
  • 打赏
  • 举报
回复
空、0、被free的内存、……,它们也是客观存在的值;而不是虚无。
linuxblack125125 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

free malloc 来的内存是同样没有 overwrite 原数据

子程序退出时 也没有 overwrite stack 的数据

os 删除文件时 也没有 overwrite 原来文件的数据


lz 说说这个怎么回事?

为了效率,只要擦除 标记即可
[/Quote]

感谢你的提醒,我茅塞顿开啊。。。非常感谢
linuxblack125125 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:
楼主想要删除栈顶元素?
那我冒昧的问一句,在楼主看来,栈顶元素被删除后应该剩下什么?一块废铜?一个黑洞?还是一个奇点?


哈哈,同问。
[/Quote]

我之前的理解是:删除栈顶元素就是将原来处于栈顶的那个元素值去掉,设为空,或者0。然后将那个内存释放掉,让它不再属于这个栈。
现在看了这么多大侠们的解释,我有点懂了,其实在内存里面那些没有用到的空间里,并不是每个地方都是空的,而是有值在那里,当我们要用的那些空间时,我们就overwrite它。所以这里也是一样。
同样在销毁一个栈时,我们只需free(S.base),将原来malloc的空间释放掉。
不知道我的理解正确否???

非常感谢各位大侠们的支持。。
AnYidan 2012-08-01
  • 打赏
  • 举报
回复
free malloc 来的内存是同样没有 overwrite 原数据

子程序退出时 也没有 overwrite stack 的数据

os 删除文件时 也没有 overwrite 原来文件的数据


lz 说说这个怎么回事?

为了效率,只要擦除 标记即可
Code_Talk 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
楼主想要删除栈顶元素?
那我冒昧的问一句,在楼主看来,栈顶元素被删除后应该剩下什么?一块废铜?一个黑洞?还是一个奇点?
[/Quote]

哈哈,同问。
自信男孩 2012-08-01
  • 打赏
  • 举报
回复
S->top++该操作会在你压栈时操作,压栈时会将新的数据存放到该栈顶指针指向的位置,所以上一次的数据就会被覆盖而存放新的数据。
baichi4141 2012-08-01
  • 打赏
  • 举报
回复
楼主想要删除栈顶元素?
那我冒昧的问一句,在楼主看来,栈顶元素被删除后应该剩下什么?一块废铜?一个黑洞?还是一个奇点?

漫步者、 2012-08-01
  • 打赏
  • 举报
回复
是它的标记在移动去取下一个值,逻辑删除,你如果要插入的话是采取覆盖的形式覆盖掉那个数据。就这么简单。
sjtit 2012-08-01
  • 打赏
  • 举报
回复
你进行top++操作应该是在入栈时,那就一定会再覆盖上去一个新值。栈往往就是这样循环再利用的,没必要一定要在出栈时清除那个单元,只要标记好栈顶位置就ok了
gongheguoyingpai11 2012-08-01
  • 打赏
  • 举报
回复
你如果不压入数据不就覆盖了之前弹出的数据区了吗,并且湛一般是以数组实现的所以只要确定数组中元素我们就知道此时栈中元素个数,所以仅仅修改size值就足以了这会决定此时我们逻辑上的栈的数据多少
baichi4141 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
我之前的理解是:删除栈顶元素就是将原来处于栈顶的那个元素值去掉,设为空,或者0。然后将那个内存释放掉,让它不再属于这个栈。
现在看了这么多大侠们的解释,我有点懂了,其实在内存里面那些没有用到的空间里,并不是每个地方都是空的,而是有值在那里,当我们要用的那些空间时,我们就overwrite它。所以这里也是一样。
同样在销毁一个栈时,我们只需free(S.base),将原来malloc的空间释放掉。
不知道我的理解正确否???

非常感谢各位大侠们的支持。。
[/Quote]
一个整型数是3,你不用它了就将它设成0
那3和0有什么本质区别?你不过是在放弃它之前最后又给它赋了一次值而已

至于说内存释放,你想的原则没错,但那是原理性的东西
在实际使用中,一次申请一大块内存然后一点点使用,比每次申请一点效率和安全性都要高得多,除非是嵌入式单片机等严格限制内存的应用环境,否则不差那点内存

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧