表达式类型的实现二叉树.docx
- 文档编号:5741269
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:17
- 大小:277.05KB
表达式类型的实现二叉树.docx
《表达式类型的实现二叉树.docx》由会员分享,可在线阅读,更多相关《表达式类型的实现二叉树.docx(17页珍藏版)》请在冰豆网上搜索。
表达式类型的实现二叉树
表达式类型的实现
一、需求分析:
1、输入时按相关提示进行输入。
2、输出的形式,输出时按相关功能进行输出。
3、功能,实现前缀表达式转换为中缀表达式,并进行相应的求值和赋值运算,与及构造复合表达式。
4、测试数据,见输出结果。
二、概要设计:
实现该程序所要用到的函数:
三、详细设计:
见源码:
1、Expression.h文件的实现
#ifndef_EXPRESSION_H_
#define_EXPRESSION_H_
//--------------------树节点类
classTreeNode
{
public:
TreeNode(char_data,TreeNode*_left,TreeNode*_right);
~TreeNode();
charGetData();
voidSetData(char_data);
voidSetLeft(TreeNode*_left);
voidSetRight(TreeNode*_right);
TreeNode*GetLeft();
TreeNode*GetRight();
private:
charData;
TreeNode*left,*right;
};
//--------------------二叉树几及表达式类
classBinaryTreeAndExpr
{
public:
BinaryTreeAndExpr();
~BinaryTreeAndExpr();
TreeNode*GetRoot();
voidSetRoot(TreeNode*_root);
voidReadExpr(char*E);
voidWriteExpr(char*E);
voidAssign(charv,intc);
staticintValue(char*E);
staticBinaryTreeAndExpr*CompoundExpr(charp,char*E1,char*E2);
voidRelease();
private:
voidReleaseRecursion(TreeNode*&p);
voidReadExprRecursion(TreeNode*&p,char*E);
voidWriteExprRecursion(TreeNode*p,char*E);
voidAssignRecursion(TreeNode*p,charv,intc);
intValueRecursion(TreeNode*p);
intPriority(charc1,charc2);
boolIsOperator(charc);
intEvaluation(inta,charop,intb);
TreeNode*root;
intExpr_i,Expr_len;
};
#endif
2、Expression.cpp文件的实现
#include
#include
#include"Expression.h"
usingnamespacestd;
//----------------------树节点类成员函数
TreeNode:
:
TreeNode(char_data,TreeNode*_left,TreeNode*_right)
{
Data=_data;
left=_left;
right=_right;
}
TreeNode:
:
~TreeNode()
{
}
charTreeNode:
:
GetData()
{
returnData;
}
voidTreeNode:
:
SetLeft(TreeNode*_left)
{
left=_left;
}
voidTreeNode:
:
SetRight(TreeNode*_right)
{
right=_right;
}
TreeNode*TreeNode:
:
GetLeft()
{
returnleft;
}
TreeNode*TreeNode:
:
GetRight()
{
returnright;
}
voidTreeNode:
:
SetData(char_data)
{
Data=_data;
}
//----------------------------二叉树几及表达式类成员函数
BinaryTreeAndExpr:
:
BinaryTreeAndExpr():
root(NULL)
{
Expr_i=Expr_len=0;
}
BinaryTreeAndExpr:
:
~BinaryTreeAndExpr()
{
}
voidBinaryTreeAndExpr:
:
Release()
{
if(root!
=NULL)
{
ReleaseRecursion(root);
delete(root);
root=NULL;
}
}
voidBinaryTreeAndExpr:
:
ReleaseRecursion(TreeNode*&p)
{
if(p->GetLeft()!
=NULL)
{
TreeNode*p1;
p1=p->GetLeft();
ReleaseRecursion(p1);
delete(p1);
}
elseif(p->GetRight()!
=NULL)
{
TreeNode*p2;
p2=p->GetRight();
ReleaseRecursion(p2);
delete(p2);
}
p=NULL;
}
TreeNode*BinaryTreeAndExpr:
:
GetRoot()
{
returnroot;
}
voidBinaryTreeAndExpr:
:
ReadExpr(char*E)
{
if(root!
=NULL){Release();root=NULL;}
Expr_i=0;
Expr_len=strlen(E);
if(Expr_len==0)return;
ReadExprRecursion(root,E);
}
voidBinaryTreeAndExpr:
:
ReadExprRecursion(TreeNode*&p,char*E)
{
if(Expr_i==Expr_len)return;
p=(TreeNode*)newTreeNode(E[Expr_i++],NULL,NULL);
chartemp=p->GetData();
if(!
IsOperator(temp))return;
else
{
TreeNode*q1,*q2;
ReadExprRecursion(q1,E);
p->SetLeft(q1);
ReadExprRecursion(q2,E);
p->SetRight(q2);
}
}
voidBinaryTreeAndExpr:
:
WriteExpr(char*E)
{
if(root==NULL){E[0]='\0';return;}
WriteExprRecursion(root,E);
}
voidBinaryTreeAndExpr:
:
WriteExprRecursion(TreeNode*p,char*E)
{
charc1,c2,c3[100],c4[100];
if(p->GetLeft()==NULL||p->GetRight()==NULL)
{
E[0]=p->GetData();
E[1]='\0';
return;
}
c1=p->GetLeft()->GetData();
c2=p->GetRight()->GetData();
if(!
IsOperator(c1)&&!
IsOperator(c2))
{
E[0]=c1;E[1]=p->GetData();E[2]=c2;E[3]='\0';
}
elseif(IsOperator(c1)&&!
IsOperator(c2))
{
WriteExprRecursion(p->GetLeft(),c3);
if(Priority(p->GetData(),p->GetLeft()->GetData())>0)
{
E[0]='(';
for(inti=0;i E[i+1]=')'; E[i+2]=p->GetData(); E[i+3]=p->GetRight()->GetData(); E[i+4]='\0'; } else { for(inti=0;i E[i]=p->GetData(); E[i+1]=p->GetRight()->GetData(); E[i+2]='\0'; } } elseif(! IsOperator(c1)&&IsOperator(c2)) { WriteExprRecursion(p->GetRight(),c3); if(Priority(p->GetData(),p->GetRight()->GetData())>0) { E[0]=p->GetLeft()->GetData(); E[1]=p->GetData(); E[2]='('; for(inti=0;i E[i+3]=')'; E[i+4]='\0'; } else { E[0]=p->GetLeft()->GetData(); E[1]=p->GetData(); for(inti=0;i E[i+2]='\0'; } } else { WriteExprRecursion(p->GetLeft(),c3); WriteExprRecursion(p->GetRight(),c4); if(Priority(p->GetData(),p->GetLeft()->GetData())>0) { E[0]='('; for(inti=0;i E[i+1]=')'; E[i+2]='\0'; } else { for(inti=0;i E[i]='\0'; } intj=strlen(E); E[j]=p->GetData(); if(Priority(p->GetData(),p->GetRight()->GetData())>0) { E[j+1]='('; for(inti=0;i E[j+2+i]=')'; E[j+3+i]='\0'; } else { for(inti=0;i E[j+1+i]='\0'; } } } intBinaryTreeAndExpr: : Priority(charc1,charc2) { switch(c1) { case'+': case'-': return-1; case'*': switch(c2) { case'+': case'-': return1; } return-1; case'/': switch(c2) { case'+': case'-': return1; } return-1; case'^': return1; } return0; } boolBinaryTreeAndExpr: : IsOperator(charc) { return! (c>=97&&c<=122||c>=48&&c<=57); } voidBinaryTreeAndExpr: : Assign(charv,intc) { AssignRecursion(root,v,c); } voidBinaryTreeAndExpr: : AssignRecursion(TreeNode*p,charv,intc) { if(p! =NULL) { if(p->GetData()==v)p->SetData(c+48); AssignRecursion(p->GetLeft(),v,c); AssignRecursion(p->GetRight(),v,c); } } BinaryTreeAndExpr*BinaryTreeAndExpr: : CompoundExpr(charp,char*E1,char*E2) { BinaryTreeAndExprBTAE1,BTAE2,*BTAE3; BTAE1.ReadExpr(E1); BTAE2.ReadExpr(E2); TreeNode*q=(TreeNode*)newTreeNode(p,NULL,NULL); q->SetLeft(BTAE1.GetRoot()); q->SetRight(BTAE2.GetRoot()); BTAE3=(BinaryTreeAndExpr*)newBinaryTreeAndExpr; BTAE3->SetRoot(q); returnBTAE3; } voidBinaryTreeAndExpr: : SetRoot(TreeNode*_root) { root=_root; } intBinaryTreeAndExpr: : Value(char*E) { BinaryTreeAndExprbtae; btae.ReadExpr(E); returnbtae.ValueRecursion(btae.GetRoot()); } intBinaryTreeAndExpr: : ValueRecursion(TreeNode*p) { charc1,c2; inttemp1,temp2; if(p->GetLeft()==NULL||p->GetRight()==NULL) { c1=p->GetData(); return(c1>=97&&c1<=122)? 0: c1-48; } c1=p->GetLeft()->GetData(); c2=p->GetRight()->GetData(); if(! IsOperator(c1)&&! IsOperator(c2)) { if(c1>=97&&c1<=122)temp1=0; elsetemp1=c1-48; if(c2>=97&&c2<=122)temp2=0; elsetemp2=c2-48; returnEvaluation(temp1,p->GetData(),temp2); } elseif(IsOperator(c1)&&! IsOperator(c2)) { temp1=ValueRecursion(p->GetLeft()); if(c2>=97&&c2<=122)temp2=0; elsetemp2=c2-48; returnEvaluation(temp1,p->GetData(),temp2); } elseif(! IsOperator(c1)&&IsOperator(c2)) { temp2=ValueRecursion(p->GetRight()); if(c1>=97&&c1<=122)temp1=0; elsetemp1=c1-48; returnEvaluation(temp1,p->GetData(),temp2); } else { temp1=ValueRecursion(p->GetLeft()); temp2=ValueRecursion(p->GetRight()); returnEvaluation(temp1,p->GetData(),temp2); } } intBinaryTreeAndExpr: : Evaluation(inta,charop,intb) { switch(op) { case'+': returna+b; break; case'-': returna-b; break; case'*': returna*b; break; case'/': returna/b; break; case'^': returnpow(a,b); break; } return0; } 3、ExpressionMain.cpp文件的实现 #include #include"Expression.h" usingnamespacestd; intmain() { BinaryTreeAndExprbtae,*btae1; charE1[100],E2[100],P,V; intswitchs,c,switchs2; boolrun=true,run2=true; while(run) { cout<<"请选择功能,功能如下: "< cout<<"1.构造复合表达试并输出相应结果."< cout<<"2.输入前缀表达试并构造中缀表达试."< cout<<"3.对前缀表达试求值."< cout<<"4.退出."< cin>>switchs; switch(switchs) { case4: run=false; break; case1: cout<<"请输入相关数据.前缀表达试"< getchar(); scanf("%s%c%s",E1,&P,E2); btae1=BinaryTreeAndExpr: : CompoundExpr(P,E1,E2); while(run2) { cout<<"如有变量要赋值请输入1,否则输入2"< cin>>switchs2; if(switchs2==1) { cout<<"请输入相关数据."< getchar(); scanf("%c%d",&V,&c); btae1->Assign(V,c); } elserun2=false; } btae1->WriteExpr(E1); cout<<"中缀表达试: "< btae1->Release(); delete(btae1); run2=true; break; case2: cout<<"请输入相关数据.前缀表达试"< cin>>E1; btae.ReadExpr(E1); while(run2) { cout<<"如有变量要赋值请输入1,否则输入2"< cin>>switchs2; if(switchs2==1) { cout<<"请输入相关数据."< getchar(); scanf("%c%d",&V,&c); btae.Assign(V,c); } elserun2=false; } cout<<"中缀表达试: "; btae.WriteExpr(E2); cout< run2=true; break; case3: cout<<"请输入相关数据.前缀表达试"< cin>>E1; btae.ReadExpr(E1); btae.WriteExpr(E2); cout<<"中缀表达试为: "; cout< cout<<"计算结果为: "; cout< : Value(E1)< break; default: cout<<"你的输入无效! 请重新输入."< break; } btae.Release(); if(run)cout< } return0; } 四、调式分析: 1、调式时递归函数不正确,出现一些逻辑错误,经改正后最终得到了正确的结果。 2、体会,学会了二叉树的使用。 五、用户使用说明: 按相关提示输入,即可得到结果。 六、测试结果: 见下页:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 表达式 类型 实现 二叉
![提示](https://static.bdocx.com/images/bang_tan.gif)