共享栈的定义
简单说就是两栈共用一片连续内存空间。
(王道书定义:)共享栈就是让两个顺序栈(一片连续内存,栈就是顺序栈)共享一个一维数组空间,将两个栈的栈底设置在共享空间的两端, 两个栈顶向共享空间的中间延伸。 如图所示(再嫖张王道书的图):
为何使用共享栈
首先介绍一下上溢和下溢,对栈而言:栈满还存为上溢,栈空再取即下溢。上溢和下溢都修改了栈之外的内存,因此有可能导致程序崩溃。
那有人就会说,那我给每个栈都分配足够大的空间就能解决上溢了吧?
这么说确实有道理,但是却有以下的问题:
①给每个栈都分配足够大的空间不太现实。
②栈内的数据在不断的变化,而一个栈只存储的一点数据的话,这样不就造成空间利用率过低?
共享栈就是因此而生的,由上面共享栈的定义可以知道它能使两个栈的空间可以相互调节(因为是共用嘛),从而更有效地利用存储空间。只有当两栈栈顶相遇(即栈满,若不清楚栈满往下看)时,存储空间被用尽,之后再进栈才会产生上溢。
由于栈往往不止一个,如果通过给每个栈分配很大的空间来解决上溢,造成的是存储空间的浪费,因此采用共享栈能在保证节省存储空间的基础上,在一定程度上减少上溢。(直白点的解释就是一个栈数据多,一个栈数据少,我本来一个栈存不下那么多的数据,我通过空间共用的方法,把你没用到的空间用来存我的数据,既提高了空间利用率,又让我不上溢。再配张一个老哥不知道哪找的图:)
所以说某道题:采用共享栈的好处是( )” 答案为:节省存储空间,降低发生上溢的可能
栈满
举个例子描述一下栈满,对于栈底指针设为 top0= -1,top1=Maxsize这种情况,需要先移动指针再赋值,假设Maxsize=5。
从上述例子可以看出,栈满条件为top1-top0=1,即两栈顶指针相邻。
栈满之后,如果再有push操作,就会发生上溢。
后记
①参考了很多网上零零碎碎的东西总结出来的,王道书上讲的也稀碎。
②文中有一张图源自 这个老哥