c++课程设计报告二叉树运算.docx
《c++课程设计报告二叉树运算.docx》由会员分享,可在线阅读,更多相关《c++课程设计报告二叉树运算.docx(8页珍藏版)》请在冰豆网上搜索。
c++课程设计报告二叉树运算
课程设计报告
设计题目:
二叉树解决四则运算问题
院系:
自动化院
班级:
2002
学号:
912110200330
姓名:
袁佳泉
指导老师:
闫玉德
时间:
2013年3月24
一.程序功能简介
利用二叉树的结构解决带括号的四则运算的问题。
程序利用二叉树的堆栈将二叉树的结点变成结点中的数据时运算符,左右子树是标准结点形式,或是另外的标准二叉树形式,通过后序遍历,经标准结点中的表达式求出。
二.课程设计要求
(1)读懂程序,将程序的运算步骤完整的描述出来。
(2)四则运算的表达式可以接受空格输入
(3)依照运算顺序依次输出四则运算每一步的算式及及结果,最后输出最终计算结果
三.课程设计思想
这个课题设计要求最关键的就是读懂程序,用类实现四则运算其实不是很难,只是利用二叉树实现带括号的四则运算有些难度。
初读源程序觉得摸不到头脑,几遍下来还是能够理解的。
在程序中先计算的式子放在栈顶,首先赋值右子树,再赋值左子树,保证优先级。
如图:
二叉树类栈运算符栈
)
—
*
(
+
输入“+”,“(”,“*”三个运算符没有优先级冲突,按顺序压栈,
然后输入“—”,优先级低于“*”,
binary_treetemp_tree;//生成二叉树
stringthisstring="";
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)对源程序进行两处修改使其能够按运算顺序依次输出四则运算每一步的算式及结果。
程序如下:
Staticintcount=0;
count++;
if(count==1)
{cout<<"运算过程及结果是";
}
cout<data<五.优化程序
源程序未能实现负数运算,只能在正数范围内运算。
于是便试图把范围推广到整个实数。
改编程序如下:
if(isok(infix))
{staticintm=0,n=0;
for(inti=0;i{c=infix[i];
if(IsOperand(c))
{if(NodeStack.top().root->right_child==0&&NodeStack.top().root->left_child==0&&NodeStack.top().root!
=0)
{stringtempstring;
tempstring=tempstring+c;
if(i+1{while(i+1{tempstring=tempstring+infix[++i];}}
binary_treetemp;
temp.root=build_node(tempstring);
copy(temp.root,NodeStack.top().root);
NodeStack.pop();
etree.root->left_child=temp.root;
temp.root=NULL;
NodeStack.push(etree);
}
else{stringtempstring;
tempstring=tempstring+c;
if(i+1{while(i+1{tempstring=tempstring+infix[++i];}}
binary_treetemp;
temp.root=build_node(tempstring);
NodeStack.push(temp);
n++;}
elseif(c=='+'||c=='-'||c=='*'||c=='/'||c=='^')
{
if(OpStack.empty())
{OpStack.push(c);m++;}
elseif(OpStack.top()=='(')
{OpStack.push(c);m++;}
elseif(TakesPrecedence(c,OpStack.top()))
{OpStack.push(c);m++;}
elseif(c=='-'&&m==n)
{binary_treetemp_tree;
stringthisstring="";
thisstring=thisstring+'-';
etree.root=build_node(thisstring);
stringthiss="";
thiss=thiss+'0';
temp_tree.root=build_node(thiss);
etree.root->right_child=temp_tree.root;
temp_tree.root=NULL;
NodeStack.push(temp_tree);//新二叉树进栈
etree.root=NULL;
}
其思路就是通过增加计数,如果运算符和操作数个数相等,且下一个是‘—’,则生成新二叉树,右孩子为0,根节点为‘—’;将下一个数作为左孩子,形成标准运算二叉树。
运行结果失败!
!
!
!
!
六.补充所用到的类
Stack:
Empty()为空则返回1
Pop()移除
Push()增加栈中元素
Size()返回栈中元素数目
Top()返回栈顶元素