- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
课程设计报告
设计题目:二叉树解决四则运算问题
院系:自动化院
班级:2002
学号:912110200330
姓名:袁佳泉
指导老师:闫玉德
时间:2013年3月24
一.程序功能简介
利用二叉树的结构解决带括号的四则运算的问题。程序利用二叉树的堆栈将二叉树的结点变成结点中的数据时运算符,左右子树是标准结点形式,或是另外的标准二叉树形式,通过后序遍历,经标准结点中的表达式求出。
课程设计要求
读懂程序,将程序的运算步骤完整的描述出来。
四则运算的表达式可以接受空格输入
依照运算顺序依次输出四则运算每一步的算式及及结果,最后输出最终计算结果
课程设计思想
这个课题设计要求最关键的就是读懂程序,用类实现四则运算其实不是很难,只是利用二叉树实现带括号的四则运算有些难度。初读源程序觉得摸不到头脑,几遍下来还是能够理解的。在程序中先计算的式子放在栈顶,首先赋值右子树,再赋值左子树,保证优先级。
如图:
二叉树类栈 运算符栈
) — * ( +
输入“+”,“(”,“*”三个运算符没有优先级冲突,按顺序压栈,
然后输入“—”,优先级低于“*”,
binary_tree temp_tree; //生成二叉树
string thisstring=;
thisstring = thisstring + OpStack.top();
OpStack.pop() //将栈顶优先级高的运算符移除(即这边的乘号)
etree.root = build_node(thisstring);//将优先级高的运算符作为二叉树的根结点
copy(temp_tree.root,NodeStack.top().root);//将二叉树堆栈栈顶的二叉树复制到新生成的二叉树中(即把1复制到新的二叉树中)
NodeStack.pop();//移除二叉树栈栈顶
etree.root-right_child = temp_tree.root;//将二叉树作为新二叉树的右分支
temp_tree.root = NULL;
copy(temp_tree.root,NodeStack.top().root); //继续将下一个栈顶二叉树复制(即把5复制)
etree.root-left_child = temp_tree.root;//成为新二叉树的左分支
NodeStack.pop();//移除
temp_tree.root = NULL;
copy(temp_tree.root, etree.root);
NodeStack.push(temp_tree);//新二叉树进栈
etree.root = NULL;
}
OpStack.push(c);//优先级低的运算符压栈
过程如图:
栈顶二叉树 temp_tree二叉树
Etree二叉树 将temp_tree作为etree的右结点
新的二叉树类栈
最后进行一个遍历,判断运算符栈是否处理完,算出最后结果。
增加的模块
(1)对源程序进行两处修改使其能够按运算顺序依次输出四则运算每一步的算式及结果。
程序如下:
Static int count=0;
count++;
if(count==1)
{cout运算过程及结果是;
}
coutnum1prt-datanum2=num\t;
优化程序
源程序未能实现负数运算,只能在正数范围内运算。于是便试图把范围推广到整个实数。
改编程序如下:if(isok(infix))
{ static int m=0,n=0 ;
for(
文档评论(0)