【数据结构】两栈共享空间的进一步理解

目录

前言

正文

对①中的理解:

对②中的疑惑:

对③④中的理解:

对栈满条件的理解:

总结 


前言

在阅读《大话数据结构》时,对文中“两栈共享空间”中部分知识点存在困惑,多读了几遍后,将其中的疑惑进行梳理一下。

(关于书中“两栈共享空间”的知识点,大家可以看一下我之前的博客 【大话数据结构】第四章总结——栈与队列

 

正文

在书中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,如果有的话,希望这篇文章可以帮助到你们。

以上为个人的观点,如果有啥需要指正的地方,欢迎在下面留言评论。

其实我感觉,学习数据结构没有啥捷径,理解跟思考挺重要的,再者,多画图有助于思考,加油!

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页