目录
前言
在阅读《大话数据结构》时,对文中“两栈共享空间”中部分知识点存在困惑,多读了几遍后,将其中的疑惑进行梳理一下。
(关于书中“两栈共享空间”的知识点,大家可以看一下我之前的博客 【大话数据结构】第四章总结——栈与队列)
正文
在书中95页提到了两栈共享空间的知识点,以下为原文
对①中的理解:
这里出现了一个n,还是比较好理解的
n就是指数组的长度,也就是用来存储两个栈的数组的长度,如下图所示
对②中的疑惑:
栈1空时,top1等于-1,那top2的取值是否会影响栈1空?
栈2空时,top2等于n,那top1的取值是否会影响栈2空?
先列举了栈1为空时,可能出现的情况
- 栈1空,栈2空
- 栈1空,栈2有值(未满)
- 栈1空,栈2满
情况1:栈1空、栈2空
此时栈的情况如下,top1=-1,top2=n(即数组的长度)
情况2:栈1空、栈2有值
此时栈的情况如下,top1=-1,top2=n-1(即栈2存放了一个元素)
情况3:栈1空、栈2满,这里存在两种情况
- 第一种是栈2的top2=n-3(如下图所示)
- 第二种是栈2的top2=0(如下图所示)
那么问题来了
第一种情况下的栈1为空还可以理解,但是第二种情况下呢?
此时栈1好像被填满了,这时应该不能算是栈1空吧?
个人认为
栈1是否为空,不能只看图中栈1是否有元素,而是应该看指向栈底的top指针
在栈的定义中,关于空栈的判定就是看top指针的,如果top=-1,即视为空栈
第二种情况下,由于这是一个两栈共享空间的数据结构
其关键思路就是:新增元素在数组的两端向中间靠拢
所以栈1的空间应该也是可以被栈2所共享
此时的top1仍然是-1,而top2是0,栈1为空,栈2为满
关于第一个疑问的解释
无论top2的值为多少,只要top1=-1,即可将栈1视为空栈
同理,第二个问题的解答也是如此
列举了栈2为空时,可能出现的情况
- 栈2空,栈1空
- 栈2空,栈1有值(未满)
- 栈2空,栈1满
情况1:栈2空,栈1空
此时栈的情况如下,top2=n,top1=-1(即数组的长度)
情况2:栈2空、栈1有值
此时栈的情况如下,top2=n-1,top1=0(即栈1存放了一个元素)
情况3:栈2空、栈1满,这里也是存在两种情况
- 第一种是栈1的top1=2(如下图所示)
- 第二种是栈1的top1=n-1(如下图所示)
这里我就不推导了,过程跟上面推导栈1为空的一样
所以第二个疑问的解释
无论top1的值为多少,只要top2=n,即可将栈2视为空栈
对③④中的理解:
如果你看懂了②中的解释,那么对③④的理解估计也比较容易了
③中极端情况下,栈1满的前提是栈2为空栈,栈1的top1=n-1
此时栈2为空,top2=n,top1=n-1,如下图所示
注意!!!
这里的n仍然是数组的长度!!!注意是数组的长度,不是单个栈的长度!!!
④中极端情况下,栈2满的前提是栈1为空栈,栈2的top2=0
此时栈1为空,top1=-1,top2=0,如下图所示
这里的top2=0的0是数组下标的意思!!!注意是数组的下标,不是栈2的栈底!!!
也就是说
文中出现的所有的n,都是数组的长度n!!!
文中出现的所有的0,都是数组的下标0!!!
一开始我就是理解错了,导致后面无法看懂,仔细琢磨后才大概弄懂了
(或许只有我一个人理解错了吧orz)
对栈满条件的理解:
判断栈满的条件是:两个指针之间相差1时,即top1 + 1 == top2为栈满
一开始我以为只有下面这种情况才是栈满
即只有top1跟top2在中间相遇这种情况,如下top1=n-4,top2=n-5
但是后来发现,因为这是一个两栈共享空间的数据结构
所以可以出现以下栈满的情况
- 栈1空,栈2占据所有栈1的空间
- 栈1有值,栈2占据部分栈1空间
- 栈1占据所有栈2的空间,栈2空
情况1:栈1空,栈2占据所有栈1的空间(或栈2空,栈1占据所有栈2的空间)
此时top1=-1,top2=0,满足top1 + 1 == top2,栈满
情况2:栈1有值,栈2占据部分栈1空间(或栈2有值,栈1占据部分栈2空间)
此时top1=0,top2=1,满足top1 + 1 == top2,栈满
情况3:栈1占据所有栈2空间,栈2空(或栈2占据所有栈1空间,栈1空)
此时top1=n-1,top2=n,满足top1 + 1 == top2,栈满
结论:
无论栈1栈2的元素怎么存储,只要满足top1 + 1 == top2,栈就是满的
总结
不知道有没有人跟我有一样的疑惑orz,如果有的话,希望这篇文章可以帮助到你们。
以上为个人的观点,如果有啥需要指正的地方,欢迎在下面留言评论。
其实我感觉,学习数据结构没有啥捷径,理解跟思考挺重要的,再者,多画图有助于思考,加油!