就业数据结构前一段时间,有一个问题,与大家分享:
用顺序存储方式存储,现两栈共享空间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]
本来这是一个非常easy的问题,想必大家一眼就能得出答案是B,但我当时不知道是那根筋抽搐,自己跟自己较劲,牛角尖钻的无厘头。最后是怎么也想不通了。那下边我就把自己一開始的想法说一下,还望各位大牛勿喷~~
这是两个栈共享一块存储空间的实例。关于栈的初始化可谓是各有各的小算盘,栈顶指针有的初始化为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将指向一个未知的空间;假设是后者的话又不符合栈的入栈规则,但也不排斥有这样的特殊规定。反正这两者都不是一个愉快的回复,将继续探索下一个,我相信总会拨云雾见青天,直到那一刻。
版权声明:本文博客原创文章。博客,未经同意,不得转载。