欢迎来到天天文库
浏览记录
ID:49462631
大小:576.50 KB
页数:19页
时间:2020-03-01
《数据结构实验二叉树.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验六:二叉树及其应用一、实验目的树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。二、问题描述首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。如算术表达式:a+b*(c-d)-e/f三、实验要求如果利用完全二叉树的性质和二叉链表结构建立一棵二叉树,分别计算统计叶子结点的个数。求二叉树的深度。十进制的四则运算的计算器可以接收用户来自键盘的输入。由输入的表达式字
2、符串动态生成算术表达式所对应的二叉树。自动完成求值运算和输出结果。四、实验环境PC微机DOS操作系统或Windows操作系统TurboC程序集成环境或VisualC++程序集成环境五、实验步骤1、根据二叉树的各种存储结构建立二叉树;2、设计求叶子结点个数算法和树的深度算法;3、根据表达式建立相应的二叉树,生成表达式树的模块;4、根据表达式树,求出表达式值,生成求值模块;5、程序运行效果,测试数据分析算法。六、测试数据1、输入数据:2.2*(3.1+1.20)-7.5/3正确结果:6.962、输入数据:(
3、1+2)*3+(5+6*7);正确输出:56七、表达式求值由于表达式求值算法较为复杂,所以单独列出来加以分析:1、主要思路:由于操作数是任意的实数,所以必须将原始的中缀表达式中的操作数、操作符以及括号分解出来,并以字符串的形式保存;然后再将其转换为后缀表达式的顺序,后缀表达式可以很容易地利用堆栈计算出表达式的值。例如有如下的中缀表达式:a+b-c转换成后缀表达式为:ab+c-然后分别按从左到右放入栈中,如果碰到操作符就从栈中弹出两个操作数进行运算,最后再将运算结果放入栈中,依次进行直到表达式结束。如上述
4、的后缀表达式先将a和b放入栈中,然后碰到操作符“+”,则从栈中弹出a和b进行a+b的运算,并将其结果d(假设为d)放入栈中,然后再将c放入栈中,最后是操作符“-”,所以再弹出d和c进行d-c运算,并将其结果再次放入栈中,此时表达式结束,则栈中的元素值就是该表达式最后的运算结果。当然将原始的中缀表达式转换为后缀表达式比较关键,要同时考虑操作符的优先级以及对有括号的情况下的处理,相关内容会在算法具体实现中详细讨论。精选范本,供参考!2、求值过程一、将原始的中缀表达式中的操作数、操作符以及括号按顺序分解出来,
5、并以字符串的形式保存。二、将分解的中缀表达式转换为后缀表达式的形式,即调整各项字符串的顺序,并将括号处理掉。三、计算后缀表达式的值。3、中缀表达式分解DivideExpressionToItem()函数。分解出原始中缀表达式中的操作数、操作符以及括号,保存在队列中,以本实验中的数据为例,分解完成后队列中的保存顺序如下图所示:队首队尾其算法思想是:从左往右按一个字节依次扫描原始中缀表达式m_string,碰到连续的数字或小数点就加到string变量str中;如果碰到括号或操作符就将原先的str推入队列,然
6、后将括号或操作符赋予str,再将str推入队列,并将str赋予空值,依次循环进行直到扫描m_string完成。4、转化为后缀表达式ChangeToSuffix()函数。将保存在队列中的中缀表达式转换为后缀表达式,并保存在栈中。这个函数也是整个表达式算法的关键,这里需要两个栈stack_A和stack_B,分别在转换过程中临时存放后缀表达式的操作数与操作符。依次从中缀表达式队列que中出列一个元素,并保存在一个string变量str中,然后按以下几方面进行处理:①如果str是“(”,则将str推入栈sta
7、ck_B。②如果str是“)”,则要考虑stack_B的栈顶是不是“(”,是的话就将“(”出栈stack_B;如果不是,则将stack_B出栈一个元素(操作符),然后将其推入栈stack_A。③如果str是“+”或“-”,则要考虑有括号和优先级的情况,如果栈stack_B为空或者栈顶为“(”,则将str推入栈stack_B;因为操作符“+”和“-”优先级相同(谁先出现就先处理谁进栈stack_A),并且低于“*”和“/”,所以当栈stack_B不为空并且栈顶不为“(”,则依次循环取出stack_B的栈顶
8、元素并依次推入栈stack_A,循环结束后再将str推入栈stack_B。④如果str是“*”或“/”,因为它们的优先级相同并且高于“+”和“-”,所以如果栈stack_B为空或者栈顶为“+”、“-”或“(”就直接将str推入栈stack_B;否则就将stack_B弹出一个元素并将其推入栈stack_A中,然后再将str推入栈stack_B中。⑤除了上述情况外就只剩下操作数了,操作数就可以直接推入栈stack_A中。注意整个过程中栈stac
此文档下载收益归作者所有