目录

前言

正文

对①中的理解:

对②中的疑惑:

对③④中的理解:

对栈满条件的理解:

总结


前言

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

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

正文

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

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

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

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

  1. 【数据结构】之两栈共享空间(C语言)

    文章目录 引言 实现之两栈共享空间 插入元素 删除元素 完整代码 引言 栈的顺序存储还是很方便的,因为它只准栈顶进出元素,所以不存在线性表插入和删除时需要移动元素的问题.不过栈有一个比较大的缺陷,就是 ...

  2. 数据结构与算法(3-1)栈(顺序栈、两栈共享空间、链栈、栈的计算器)

    目录 一.顺序栈 存储结构 总代码 二.两栈共享空间 存储结构: 总代码: 三.链栈 存储结构: 总代码: 一.顺序栈 存储结构: 栈特点:先进后出,后进先出.(特殊的线性表) 入栈时在栈顶添加元素, ...

  3. 【数据结构】两栈共享空间(双端栈)

    1.定义 两栈共享空间:使用一个数组来存储两个栈,让一个栈的栈底为该数组的始端,另一个栈的栈底为该数组的末端,两个栈从各自的端点向中间延伸. 栈1的底固定在下标为0的一端: 栈2的底固定在下标为Sta ...

  4. 顺序栈的实现和两栈共享空间

    顺序栈的实现和两栈共享空间 一.顺序栈的实现 栈(stack)是限定仅在表尾进行插入或删除操作的线性表.我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的 ...

  5. 两栈共享空间的存储结构设计

    两栈共享空间的存储结构设计 概述 数据结构设计 算法设计 1. 入栈(需预先判断是否栈满) 2. 出栈(需预先判断是否栈空) 概述 由于栈的插入和删除操作具有它的特殊性,用顺序存储结构表示的栈插入或删 ...

  6. 两栈共享空间 C语言实现

    /* 两栈共享空间 作者:S_hmily 日期:2011年8月31日 编译环境:VC6.0++ 栈1空 S->top1 == -1 栈2空 S->top2 == MaxSize 栈满 S- ...

  7. 数据结构--栈--两栈共享空间

    如何将两个栈使用同一个内存空间 将一个栈的栈底为数据的终端,即下标为0 另一个栈的栈底为数据的末端,即下标为n-1 如下图: /*两栈共享空间结构*/ typedef struct { SElemTy ...

  8. 两栈共享存储空间算法

    我们知道栈是一种先进后出的结构,我们用顺序存储结构进行实现,也是很方便的,唯一的缺陷就是必须事先确定数组存储空间大小,万一不够用了,就需要编程手段扩展数组容量,非常麻烦.对于一个栈,我们只能经理设计出 ...

  9. 两栈共享存储空间(线性结构栈)

    #ifndef DOUBLESTACK_H #define DOUBLESTACK_H /*(1)引入1.如果需要两个相同类型的栈(顺序结构), 分别为了两个栈开辟存储空间.极有可能出现的情况是栈1已 ...

最新文章

  1. python3调用函数len结果不返回字符串长度_Python通过len函数返回对象长度
  2. .NETFramework-Web.Mvc:ActionResult
  3. 机器学习中Python常用库总结(numpy,scipy,matplotlib,pandas)
  4. 【杂谈】一招,同时可视化18个开源框架的网络模型结构和权重
  5. 获得北大新材料学院夏令营offer的艰险历程(附面试答辩PPT)
  6. linux on zfs,在zfsonlinux中增长zpool
  7. SVN版本管理工具使用中常见的代码提交冲突问题的解决方法
  8. J2CL –迟到总比不到好
  9. Java命令行界面(第5部分):JewelCli
  10. Divide by Zero 2018 and Codeforces Round #474 (Div. 1 + Div. 2, combined)
  11. 豆瓣评分 9.7,等了好久的《操作系统导论》Operating Systems 终于来了
  12. verilog 生成块_Verilog数字系统设计教程之学习摘要
  13. ORA-00955: 鍚嶇О宸茬敱鐜版湁瀵硅薄浣跨敤
  14. php debugdumpparams,PHP PDOStatement::debugDumpParams讲解
  15. 加密、签名以及苹果的双重签名机制
  16. 一个完整的项目管理流程
  17. JS 开启 win10 触屏键盘
  18. 1350: 最佳校友
  19. 同事不到30岁,目前已失业4个月,出路在哪里?
  20. jdk11 下载与安装(非常详细,一步不落!!!)

热门文章

  1. 信号调理方式(放大、滤波、隔离、调制解调等)
  2. 警告框处理与下拉框选择_Sinno_Song_新浪博客
  3. 计算机专业助我成长作文600,科技伴随我成长作文
  4. OPS and So on.
  5. CSS如何实现文字两端对齐
  6. std::tuple、std::tie(可用于结构体大小比较)、std::pair用法
  7. 如何通过限制 IP 相关信息 | 控制用户访问站点频率
  8. 带图片的日历html,HTML漂亮的日历插件
  9. 机器学习:从决策树到xgboost
  10. 程序员笔试面试注意事项-1