两个栈共享一块存储空间新解

     前段时间数据结构的作业里有一个这样的题跟大家分享一下:

     若栈采用顺序存储方式存储,现两栈共享空间V[1..m], top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是( )。

 

  A. |top[2]-top[1]|=0      B. top[1]+1=top[2] 

 

  C. top[1]+top[2]=m      D. top[1]=top[2]

 

       这是两个栈共享一块存储空间的实例。关于栈的初始化可谓是各有各的小算盘,栈顶指针有的初始化为0,有的初始化为1,还有的初始化为-1。先不管它,按照C语言的规则,咱们还是把栈顶指针初始化为0,这样便于计算。那首先大家想象一下有这么一块内存,大小为50,由于栈限定只能在栈顶进行操作,那么我们就把这块内存空间的顶端和低端分别作为2栈和1栈的栈底,当入栈时相当于两列火车相向而行,等待着相撞的那一瞬间,只要不撞车就继续前行,这样就降低了上溢发生的机率,节省了内存空间。

       于是乎问题来喽,什么时候算是满栈,有人说了不就是等到两个栈相遇的时候嘛,那怎么判定两个栈相遇呢?又有人说了等到栈顶指针相遇时不就是栈满了嘛,yes,关键就是这里,我当初也就是纠结这两个栈顶指针。脑子里出现了很多画面,两个栈顶指针top1和top2从两端出发,期待着能与彼此相遇,走啊走走啊走,终于等到了相见的那一天。由于栈顶指针总是位于栈顶元素的下一个位置,所以当top1和top2相遇时,即top1+1=top2,两个栈满员,经过了多少风风雨雨,有情人终成眷属,祝福他们吧。

       但是当两个栈顶指针相遇时,它们所指的是两个空的存储单元,那这不就浪费了嘛,所以我就想能不能把这两个栈顶指针所指的空间填满,这不就完美了么,于是乎问题又来了,如果是1栈先加入元素,那么top1不就与top2重合了嘛,反之一样,最理想的就是两个栈同时入栈元素,但想到这里已经知道自己错了,不可能会出现歧义,其实更为神奇的是我居然想到当两个栈顶指针重合时再入栈元素的话,那么top1不就越过top2了嘛,于是就有了top2+1=top1,哎,各种版本都有啊,我是彻底无力了。

       为此在网上搜集了各种相关资料,真是众说纷纭啊,也是充斥着各种版本,不过最后答案一致指向B,还是top1+1=top2。最后求救于老师,老师的看法是当两个栈顶指针相遇时就算是栈满,至于那两小块空出来的内存空间就当是标记,就像循环队列一样,最后也是留出两个小空间用于说明头指针和尾指针,就是这么个情况。

 

       通过这个例子又想起了那个最传统的问题,关于常规的入栈,当top=Maxsize-1即栈顶指针到达真正的栈顶时,如果再入栈元素,那么栈顶指针是指向Maxsize还是保持不动。假如是前者的话,那么top将指向一个未知的空间;如果是后者的话又不符合栈的入栈规则,但也不排斥有这种特殊规定。反正这两者都不是一个满意的答复,在下将继续探索,相信总会等到拨云雾见蓝天的那一刻。

————————————————————————————————————————————————————

这是2014.5.17的文章,之前不知为何显示审核未通过,经过几次修改终于重见天日了,但这个发表时间也就变成了2019.12.20,很不合理啊

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beyond_LH

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值