【数据结构】两栈共享空间的进一步理解
目录
前言
正文
对①中的理解:
对②中的疑惑:
对③④中的理解:
对栈满条件的理解:
总结
前言
在阅读《大话数据结构》时,对文中“两栈共享空间”中部分知识点存在困惑,多读了几遍后,将其中的疑惑进行梳理一下。
(关于书中“两栈共享空间”的知识点,大家可以看一下我之前的博客 【大话数据结构】第四章总结——栈与队列)
正文
在书中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,如果有的话,希望这篇文章可以帮助到你们。
以上为个人的观点,如果有啥需要指正的地方,欢迎在下面留言评论。
其实我感觉,学习数据结构没有啥捷径,理解跟思考挺重要的,再者,多画图有助于思考,加油!
【数据结构】两栈共享空间的进一步理解相关推荐
- 【数据结构】之两栈共享空间(C语言)
文章目录 引言 实现之两栈共享空间 插入元素 删除元素 完整代码 引言 栈的顺序存储还是很方便的,因为它只准栈顶进出元素,所以不存在线性表插入和删除时需要移动元素的问题.不过栈有一个比较大的缺陷,就是 ...
- 数据结构与算法(3-1)栈(顺序栈、两栈共享空间、链栈、栈的计算器)
目录 一.顺序栈 存储结构 总代码 二.两栈共享空间 存储结构: 总代码: 三.链栈 存储结构: 总代码: 一.顺序栈 存储结构: 栈特点:先进后出,后进先出.(特殊的线性表) 入栈时在栈顶添加元素, ...
- 【数据结构】两栈共享空间(双端栈)
1.定义 两栈共享空间:使用一个数组来存储两个栈,让一个栈的栈底为该数组的始端,另一个栈的栈底为该数组的末端,两个栈从各自的端点向中间延伸. 栈1的底固定在下标为0的一端: 栈2的底固定在下标为Sta ...
- 顺序栈的实现和两栈共享空间
顺序栈的实现和两栈共享空间 一.顺序栈的实现 栈(stack)是限定仅在表尾进行插入或删除操作的线性表.我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的 ...
- 两栈共享空间的存储结构设计
两栈共享空间的存储结构设计 概述 数据结构设计 算法设计 1. 入栈(需预先判断是否栈满) 2. 出栈(需预先判断是否栈空) 概述 由于栈的插入和删除操作具有它的特殊性,用顺序存储结构表示的栈插入或删 ...
- 两栈共享空间 C语言实现
/* 两栈共享空间 作者:S_hmily 日期:2011年8月31日 编译环境:VC6.0++ 栈1空 S->top1 == -1 栈2空 S->top2 == MaxSize 栈满 S- ...
- 数据结构--栈--两栈共享空间
如何将两个栈使用同一个内存空间 将一个栈的栈底为数据的终端,即下标为0 另一个栈的栈底为数据的末端,即下标为n-1 如下图: /*两栈共享空间结构*/ typedef struct { SElemTy ...
- 两栈共享存储空间算法
我们知道栈是一种先进后出的结构,我们用顺序存储结构进行实现,也是很方便的,唯一的缺陷就是必须事先确定数组存储空间大小,万一不够用了,就需要编程手段扩展数组容量,非常麻烦.对于一个栈,我们只能经理设计出 ...
- 两栈共享存储空间(线性结构栈)
#ifndef DOUBLESTACK_H #define DOUBLESTACK_H /*(1)引入1.如果需要两个相同类型的栈(顺序结构), 分别为了两个栈开辟存储空间.极有可能出现的情况是栈1已 ...
最新文章
- python3调用函数len结果不返回字符串长度_Python通过len函数返回对象长度
- .NETFramework-Web.Mvc:ActionResult
- 机器学习中Python常用库总结(numpy,scipy,matplotlib,pandas)
- 【杂谈】一招,同时可视化18个开源框架的网络模型结构和权重
- 获得北大新材料学院夏令营offer的艰险历程(附面试答辩PPT)
- linux on zfs,在zfsonlinux中增长zpool
- SVN版本管理工具使用中常见的代码提交冲突问题的解决方法
- J2CL –迟到总比不到好
- Java命令行界面(第5部分):JewelCli
- Divide by Zero 2018 and Codeforces Round #474 (Div. 1 + Div. 2, combined)
- 豆瓣评分 9.7,等了好久的《操作系统导论》Operating Systems 终于来了
- verilog 生成块_Verilog数字系统设计教程之学习摘要
- ORA-00955: 鍚嶇О宸茬敱鐜版湁瀵硅薄浣跨敤
- php debugdumpparams,PHP PDOStatement::debugDumpParams讲解
- 加密、签名以及苹果的双重签名机制
- 一个完整的项目管理流程
- JS 开启 win10 触屏键盘
- 1350: 最佳校友
- 同事不到30岁,目前已失业4个月,出路在哪里?
- jdk11 下载与安装(非常详细,一步不落!!!)
热门文章
- 信号调理方式(放大、滤波、隔离、调制解调等)
- 警告框处理与下拉框选择_Sinno_Song_新浪博客
- 计算机专业助我成长作文600,科技伴随我成长作文
- OPS and So on.
- CSS如何实现文字两端对齐
- std::tuple、std::tie(可用于结构体大小比较)、std::pair用法
- 如何通过限制 IP 相关信息 | 控制用户访问站点频率
- 带图片的日历html,HTML漂亮的日历插件
- 机器学习:从决策树到xgboost
- 程序员笔试面试注意事项-1