数据结构实验二叉树.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验六:二叉树及其应用 一、实验目的 树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。 二、问题描述 首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。 如算术表达式:a+b*(c-d)-e/f 三、实验要求 如果利用完全二叉树的性质和二叉链表结构建立一棵二叉树,分别计算统计叶子结点的个数。求二叉树的深度。十进制的四则运算的计算器可以接收用户来自键盘的输入。由输入的表达式字符串动态生成算术表达式所对应的二叉树。自动完成求值运算和输出结果。 四、实验环境 PC 微机 DOS 操作系统或 Windows 操作系统 Turbo C 程序集成环境或 Visual C++ 程序集成环境 五、实验步骤 1、根据二叉树的各种存储结构建立二叉树; 2、设计求叶子结点个数算法和树的深度算法; 3、根据表达式建立相应的二叉树,生成表达式树的模块; 4、根据表达式树,求出表达式值,生成求值模块; 5、程序运行效果,测试数据分析算法。 六、测试数据 1、输入数据:2.2*(3.1+1.20)-7.5/3 正确结果:6.96 2、输入数据:(1+2)*3+(5+6*7); 正确输出:56 七、表达式求值 由于表达式求值算法较为复杂,所以单独列出来加以分析: 1、主要思路:由于操作数是任意的实数,所以必须将原始的中缀表达式中的操作数、操作符以及括号分解出来,并以字符串的形式保存;然后再将其转换为后缀表达式的顺序,后缀表达式可以很容易地利用堆栈计算出表达式的值。 例如有如下的中缀表达式: a+b-c 转换成后缀表达式为: ab+c- 然后分别按从左到右放入栈中,如果碰到操作符就从栈中弹出两个操作数进行运算,最后再将运算结果放入栈中,依次进行直到表达式结束。如上述的后缀表达式先将 a 和 b 放入栈中,然后碰到操作符“+”,则从栈中弹出a 和 b 进行a+b 的运算,并将其结果 d(假设为d)放入栈中,然后再将 c 放入栈中,最后是操作符“-”,所以再弹出 d 和 c 进行 d-c 运算,并将其结果再次放入栈中,此时表达式结束,则栈中的元素值就是该表达式最后的运算结果。当然将原始的中缀表达式转换为后缀表达式比较关键,要同时考虑操作符的优先级以及对有括号的情况下的处理,相关内容会在算法具体实现中详细讨论。 2、求值过程 一、将原始的中缀表达式中的操作数、操作符以及括号按顺序分解出来,并以字符串的形式保存。 二、将分解的中缀表达式转换为后缀表达式的形式,即调整各项字符串的顺序,并将括 号处理掉。 三、计算后缀表达式的值。 3、中缀表达式分解 2.2*( 3.1+ 2.2 * ( 3.1 + 1.20 ) - 7.5 / 3 队首队尾 其算法思想是:从左往右按一个字节依次扫描原始中缀表达式 m_string,碰到连续的数字或小数点就加到 string 变量 str 中;如果碰到括号或操作符就将原先的 str 推入队列, 然后将括号或操作符赋予 str,再将 str 推入队列,并将 str 赋予空值,依次循环进行直到扫描 m_string 完成。 4、 转化为后缀表达式 ChangeToSuffix()函数。将保存在队列中的中缀表达式转换为后缀表达式,并保存在栈中。这个函数也是整个表达式算法的关键,这里需要两个栈 stack_A 和 stack_B,分别在转换过程中临时存放后缀表达式的操作数与操作符。依次从中缀表达式队列 que 中出列一个元素,并保存在一个 string 变量 str 中,然后按以下几方面进行处理: ①如果 str 是“(”,则将 str 推入栈 stack_B。 ②如果 str 是“)”,则要考虑 stack_B 的栈顶是不是“(”,是的话就将“(”出栈 stack_B; 如果不是,则将 stack_B 出栈一个元素(操作符),然后将其推入栈 stack_A。 ③如果 str 是“+”或“-”,则要考虑有括号和优先级的情况,如果栈 stack_B 为空或者栈顶为“(”,则将 str 推入栈 stack_B;因为操作符“+”和“-”优先级相同(谁先出现就先处理谁进栈 stack_A),并且低于“*”和“/”,所以当栈stack_B 不为空并且栈顶不为“(”,则依次循环取出 stack_B 的栈顶元素并依次推入栈 stack_A,循环结束后再将 str 推入栈 stack_B。 ④如果 str 是“*”或“/”,因为它们的优先级相同并且高于“+”和“-”,所以如果栈stack_B 为空或者栈顶为“+”、“-”或“(”就直接将 str 推入栈 stack_B;否则就将 stack_B弹出一个元素并将其推入栈

文档评论(0)

tianya189 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档