【数据结构】共享栈详解 判断共享栈满条件&栈顶指针变化详解&记忆方法&例题

摘要:简单易懂,详细地介绍共享栈概念,指针,判断共享栈栈满条件以及记忆方法等

目录

共享栈概念

栈顶指针&变化详解

栈顶指针种类的记忆方法

判断栈满条件

判断栈满条件的记忆方法

例题

解题思路


共享栈概念

        简单来说就是两个顺序栈共享一个一维数组空间,分别叫这两个栈为0号栈和1号栈,一般规定0号栈从数组的第一个元素开始向后存储,而1号栈则是从最后一个元素向前存储

栈顶指针&变化详解

1.先来看最经典的情况:

我们把0,1号栈的栈顶指针分别称作top0和top1,最经典的情况就是初始情况下top0=-1,top1=Maxsize,并且初始情况下0,1号栈都为空。

在这种情况下,从top0=-1 可以看到:top0初始指向的是栈数组中不存在的位置-1,然后我们向0号栈中压入第一个元素,要将元素存储到数组中,则需要top0指向数组的第一个位置即为data[0],那么我们在压栈的操作中,首先需要将栈顶指针自增一次(自增后top0=0,刚好指向栈数组的第一位),然后进行压栈操作,将数据存储到了data[0]处。(我把栈数组叫data[])

那么从这个过程中可以发现:

top0初值为-1时:

top0永远指向的就是0号栈当前栈顶的位置如果当前指向一个不存在的位置top0=-1,即为栈空,压栈时先top0++,再压入元素

同理,我们来观察top1的情况,top1初值为Maxsize,观察一下,栈数组的大小为Maxsize,但是栈数组的下标变化范围是data[0]~data[Maxsize-1],那么就是说,top1的初值也是超出了数组的范围,是数组最后一个元素的下一位。那么要进行压栈的话,也需要先将栈顶指针top1挪动一位才能将数据压入data[Maxsize]的位置(注意:1号栈每次压栈的指针变动是自减一次)

那么我们也可以发现:

top1初值为Maxsize时:

top1永远指向的就是1号栈当前栈顶的位置如果当前指向一个不存在的位置top1=Maxsize,即为栈空,压栈时先top1--,再压入元素

总结一下:初始情况下top0=-1,top1=Maxsize,两个指针都指向当前元素(栈顶)的位置,初始值都指向一个不存在的位置(都代表栈空),在进行压栈操作时都先改变指针再赋值

2.接下来看看第二种情况:
(感谢评论区两位同学的指正 红色圈出部分已修改)

初值top0=0,top1=Maxsize - 1,都指向的是存在的数组单元的位置,说明这次进行第一次压栈操作时不需要先变化栈顶指针,那么我们可以得到在这种情况下压栈不需要先变化指针,而是可以直接压入元素压入元素后再变化栈顶指针(top0++,top1--)、

从这个过程中可以发现:

top0初值为0时:

top0永远指向的就是0号栈当前栈顶的下一元素位置如果当前指向第一个位置top0=0,即为栈空,压栈时先压入元素,再top0++

top1初值为Maxsize-1时:

top1永远指向的就是1号栈当前栈顶的下一元素位置如果当前指向第一个位置top1=Maxsize-1,即为栈空,压栈时先压入元素,再top1--

那么再总结一下就是:初始情况下top0=0,top1=Maxsize-1,两个指针都指向当前元素(栈顶)的下一元素位置位置,初始值都指向实际存在的位置(都代表栈空),在进行压栈操作时都先赋值再改变指针

3.两个指针一个指向当前位置,一个指向下一位置

这个情况详细来看有两种,分别是(这个就不给图了)

①top0=-1,top1=Maxsize-1

top0指向当前栈顶位置(初始指向不存在的位置) 但是top1指向当前元素的下一个位置(初始指向存在的位置),0号栈压栈时先操作指针再存入元素,1号栈压栈时先存入元素再操作指针。

②top0=0,top1=Maxsize

top0指向当前元素的下一个位置(初始指向存在的位置)top1指向当前栈顶位置(初始指向不存在的位置) 但是,0号栈压栈时先存入元素再操作指针,1号栈压栈时先操作指针再存入元素。

栈顶指针种类的记忆方法

其实看着上面有4个情况比较复杂,但是其实关于栈顶指针只有两种状态,第一种就是初始值指向不存在的位置,那么压栈就必须先改变指针再存储数据(如第一个例子),第二种就是初始值指向存在位置(如第二个例子),第三种情况下的两种不同小情况只是将top0和top1两个指针分别应用了一二中已经讲过的两个状态

判断栈满条件

其实对于判断共享栈满的条件,一些课本辅导书上写的式子比较难理解,而且分了很多种情况需要分别记忆,就很难,这里我总结了一下我自己的想法

首先我们判断栈满唯一不变的思想

当0号栈栈顶元素的实际存储位置和1号栈栈顶元素的实际存储位置相邻的时候,共享栈满。

我们再规定一下寻找栈满条件时永远用实际位置关系转化为寻找指针的数学关系,并且总用top0找top1(这个请看后面的讲解)

注意:相邻代表着两个栈顶在数组中是邻居,即为数组中相连的两个元素,一个栈占一个。共享栈中两个栈的栈顶绝对不能是同一个数组元素!!!

这里我不选择直接用指针来判断的原因就是指针有四种组合呢,一次记下四种实在是记不住(至少我自己是这样,哈哈哈哈而且我就是因为这个才开了这篇博客来做记录整理)

1.那么还是先来看最经典的情况:

top0=-1,top1=Maxsize,初始情况下0,1号栈都为空。我们知道这个情况下两个栈顶指针都指向的是当前栈顶的位置,我们的思想是让两个栈顶元素相邻,而现在指针就指向的是栈顶元素,那么我们只需要让两个栈顶指针相邻,就可以得出栈满了

那么我们看看这个情况下栈满的样子:

此时top0在top1的后面一位,寻找一下top0与top1的数学关系,很容易就的出来top0如果再+1的话,它的值就会等于top1的值,所以我们得出一个结论:

当初始top0=-1,top1=Maxsize时,若top0+1=top1则共享栈满

(此时进行一下移项,我们可以得到top1-top0=1时栈满,这里我们就得到了和一些课本或者辅导书上相同的结论了)

2.那接下来看看第二种情况:

 

初值top0=0,top1=Maxsize,我们知道这个情况下两个栈顶指针都指向的是当前栈顶的下一个位置

那么在栈满的时候,两个栈顶元素相邻,此时我们可以看到两个栈顶指针还是相邻,但是他们的位置互换了! top0在top1的前面一位,我们此时再次寻找top0和top1的数学关系,可以得到:

当初始top0=0,top1=Maxsize-1时,若top0-1=top1则共享栈满

3.那我们最后再看看剩下的两种情况

两个指针一个指向当前位置,一个指向下一位置时该如何判断栈满:

废话不多说 直接上图 我知道还是画图清晰哈哈哈(顺便可以补充上之前介绍指针的时候没有画的图)

①top0=-1,top1=Maxsize-1

top0指向当前栈顶位置(初始指向不存在的位置) 但是top1指向当前元素的下一个位置(初始指向存在的位置)

吼哗!当栈满的时候,两个栈顶元素相邻,但是我们发现因为top0指向当前元素,top1指向下一个元素,导致这两个指针指在了同一个位置!

那就简单了:

当初始top0=-1,top1=Maxsize-1时,若top0=top1则栈满

 ②top0=0,top1=Maxsize

top0指向当前元素的下一个位置(初始指向存在的位置)top1指向当前栈顶位置(初始指向不存在的位置)

 

哈哈哈这个和上面也一样啦 只不过这次俩指针都在1号栈的栈顶碰面的

 那也简单了:

当初始top0=0,top1=Maxsize时,若top0=top1则栈满

最后整理一下:

当初始top0=-1,top1=Maxsize时,若top0+1=top1则共享栈满

当初始top0=0,top1=Maxsize-1时,若top0-1=top1则共享栈满

当初始top0=-1,top1=Maxsize-1或初始top0=0,top1=Maxsize时,若top0=top1则栈满

判断栈满条件的记忆方法

其实看着上面有4个情况也比较复杂,但是其实判断栈满也是从栈顶指针只有两种状态入手,然后先让栈中物理元素碰个面(相邻),然后再根据指针种类(指向当前元素还是下一个)来判断指针之间的数学关系,最后写出一个表达式。

例题

1.设有一个顺序共享栈Share[0:n-1],其中第一个栈顶指针top1的初值为-1,第二个栈顶指针top2的初值为n,则判断共享栈满的条件是()。

A.top2-top1==1                                        B.top1-top2==1

C.top1==top2                                           D.以上都不对

                                                                                        答案:A

解题思路

可以每次做同样的题都按照这个思路来推导答案 而不是死记硬背结论

首先我们看看数组的总长度为n,不是n-1等奇怪的数字,防止有坑,那么可以得到Maxsize=n

然后再看top1是第一个栈的栈顶,top2是第二个栈的栈顶,注意名称和前面讲解的不同,避免熟悉结论的同学直接写答案反而写错

top1初值为-1 即指向不存在的位置 那么top1指针变化为先改变指针值再存储数据 即top1指向的就是数据的位置

top2初值为n 即为Maxsize 指向的也是不存在的位置 同理top2也是先改变值再存储数据 即top2指向的也是数据的位置

同时再注意一下这两个指针的方向! top1从左到右 top2从右到左

当两个栈顶元素相邻的时候 两个指针也刚好相邻 top1在top2左边一个元素

top1+1==top2 得到top2 - top1 == 1,选A选项

  • 48
    点赞
  • 191
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

P1nkBlood

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

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

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

打赏作者

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

抵扣说明:

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

余额充值