利用二叉树以及栈对算术表达式实现四则运算等计算功能代码.docx
- 文档编号:24805867
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:17
- 大小:17.39KB
利用二叉树以及栈对算术表达式实现四则运算等计算功能代码.docx
《利用二叉树以及栈对算术表达式实现四则运算等计算功能代码.docx》由会员分享,可在线阅读,更多相关《利用二叉树以及栈对算术表达式实现四则运算等计算功能代码.docx(17页珍藏版)》请在冰豆网上搜索。
利用二叉树以及栈对算术表达式实现四则运算等计算功能代码
#include
#include
#include
#include
#include
usingnamespacestd;
boolIsOperator(stringmystring)//判断字符串是否是运算符
{
if(mystring=="-"||mystring=="+"||mystring=="*"||mystring=="/"||mystring=="^"||mystring=="%")
returntrue;
else
returnfalse;
}
boolIsOperator(charops)//判断一个字符是否是运算符
{
if(ops=='+'||ops=='-'||ops=='*'||ops=='/'||ops=='^'||ops=='%'||ops=='('||ops==')')
returntrue;
else
returnfalse;
}
boolIsOperand(charch)//判断是否是数字
{
if(((ch>='0')&&(ch<='9'))||(ch=='.'))
returntrue;
else
returnfalse;
}
boolisok(stringexp)//判断输入是否正确
{
charcheck;
interror=0,lb=0,rb=0,numofoperand=0,numofoperator=0;
for(intm=0;m { check=exp[m]; if(IsOperand(check)) { if(check=='.') { if(! (exp[m-1]>='0'&&exp[m-1]<='9')&&(exp[m+1]>='0'&&exp[m+1]<='9')) { error++; cout<<"浮点型数据输入有误! ! ! "< } } numofoperand++; } elseif(IsOperator(check)) { if(check==')') { rb++; if(rb>lb) { error++; cout<<"右括号不可能大于左括号! ! ! "< } if(IsOperator(exp[m+1])&&(exp[m+1]=='+'||exp[m+1]=='-'||exp[m+1]=='*'||exp[m+1]=='/'||exp[m+1]=='^'||exp[m+1]==')'||exp[m+1]=='%')) { numofoperator++; m++; if(exp[m]==')') rb++; } elseif(IsOperator(exp[m+1])||IsOperand(exp[m+1])) { error++; cout<<"右括号后不可能直接跟数据或左括号! ! ! "< } } elseif(check=='(') { lb++; if(IsOperator(exp[m+1])&&exp[m+1]=='(') { m++; lb++; } elseif(IsOperator(exp[m+1])) { error++; cout<<"左括号后运算符只能跟左括号! ! ! "< } } else { numofoperator++; if(IsOperator(exp[m+1])&&exp[m+1]=='(') { m++; lb++; } elseif(IsOperator(exp[m+1])) { error++; cout<<"非括号的运算符不能直接接非括号运算符! ! ! "< } } } else { error++; cout< ! ! "< } } if((error==0)&&(lb==rb)&&(numofoperand! =0)&&(numofoperator! =0)) returntrue; else returnfalse; } booladdition(charOperatorA,charOperatorB)//A=B返回TRUE. { if(OperatorA==OperatorB||(OperatorA=='*'&&OperatorB=='/')||(OperatorA=='/'&&OperatorB=='*')||(OperatorA=='+'&&OperatorB=='-')||(OperatorA=='-'&&OperatorB=='+')) returntrue; else returnfalse; } boolTakesPrecedence(charOperatorA,charOperatorB)//按照优先级用if从最优至最后从上至下排列,从而达到比较A与B的优先级 { if(OperatorA=='(') returnfalse; elseif(OperatorB=='(') returnfalse; elseif(OperatorB==')') returntrue; elseif(addition(OperatorA,OperatorB)) returnfalse; elseif((OperatorA=='^')&&(OperatorB=='^')) returnfalse; elseif(OperatorA=='^') returntrue; elseif(OperatorB=='^') returnfalse; elseif((OperatorA=='%')&&(OperatorB=='%')) returnfalse; elseif(OperatorA=='%') returntrue; elseif(OperatorB=='%') returnfalse; elseif((OperatorA=='*')||(OperatorA=='/')) returntrue; elseif((OperatorB=='*')||(OperatorB=='/')) returnfalse; elseif((OperatorA=='+')||(OperatorA=='-')) returntrue; else returntrue; } //****************************************************************************// classBinNode{ public: stringdata; BinNode*left_child; BinNode*right_child; BinNode(stringk)//构造函数 { data=k; left_child=NULL; right_child=NULL; } }; classbinary_tree { public: BinNode*root;//根节点 binary_tree(void){root=NULL;}//构造函数 voidprint(void){print(root);} voidprint(BinNode*p) { if(p! =NULL) { print(p->left_child); print(p->right_child); cout< } } voidevaluate(void){evaluate(root);} boolevaluate(BinNode*prt)//计算二叉树一个节点 { if(IsOperator(prt->data)&&! IsOperator(prt->left_child->data)&&! IsOperator(prt->right_child->data)) { floatnum=0; floatnum1=atof(prt->left_child->data.c_str()); floatnum2=atof(prt->right_child->data.c_str()); if(prt->data=="+") num=num1+num2; elseif(prt->data=="-") num=num1-num2; elseif(prt->data=="*") num=num1*num2; elseif(prt->data=="/") { if(num2==0.0) { cout<<"除数为零! ! ! 运算出错"; return0; } else num=num1/num2; } elseif(prt->data=="^") num=pow(num1,num2); elseif(prt->data=="%") { if(num2==0.0) { cout<<"除数为零! ! ! 运算出错"; return0; } else num=(long)num1%(long)num2; } stringstreambob; bob< stringsuzzy(bob.str()); prt->data=suzzy; prt->left_child=NULL; prt->right_child=NULL; } elseif(prt->left_child==NULL&&prt->right_child==NULL); else { evaluate(prt->left_child); evaluate(prt->right_child); evaluate(prt); } return1; } voidclear_help(void) { clear_help(root); } voidclear_help(BinNode*rt) { if(rt! =NULL) { clear_help(rt->left_child); clear_help(rt->right_child); deletert; } } }; BinNode*build_node(stringx) { BinNode*new_node; new_node=newBinNode(x); return(new_node); } voidcopy(BinNode*&r1,BinNode*r2)//请注意这里的*&! ! ! { if(r2==NULL) r1=NULL; else { r1=build_node(r2->data); copy(r1->left_child,r2->left_child); copy(r1->right_child,r2->right_child); } } /****************************************************************************/ intmain() { binary_treeetree; stack stack stringinfix; charchoice='y'; charc; while(choice=='y'||choice=='Y') { cout< "< getline(cin,infix); for(intj=0;j { if(infix[j]=='') { infix.erase(j,1); j--; } } cout<<"华丽的分割线"< cout<<"Expression: "< if(isok(infix)) { for(inti=0;i { c=infix[i]; if(i==0&&c=='-')//若开始为负,则把零压入运算数栈,把'-'压入运算符栈 { binary_treetemp; temp.root=build_node("0"); NodeStack.push(temp); OpStack.push('-'); } else if(IsOperand(c)) { stringtempstring=""; tempstring=tempstring+c; while(i+1 { tempstring+=infix[++i]; } binary_treetemp; temp.root=build_node(tempstring); NodeStack.push(temp); } elseif(c=='+'||c=='-'||c=='/'||c=='*'||c=='^'||c=='%') { if(OpStack.empty()) OpStack.push(c); elseif(OpStack.top()=='(') OpStack.push(c); elseif(TakesPrecedence(c,OpStack.top())) OpStack.push(c); else { while(! OpStack.empty()&&(TakesPrecedence(OpStack.top(),c)||addition(OpStack.top(),c))) { binary_treetemp_tree; stringthisstring=""; thisstring=thisstring+OpStack.top(); OpStack.pop(); etree.root=build_node(thisstring); copy(temp_tree.root,NodeStack.top().root); NodeStack.pop(); etree.root->right_child=temp_tree.root; temp_tree.root=NULL; copy(temp_tree.root,NodeStack.top().root); 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); } } if(c=='(')//若中间遇到括号,则判断下一位是否为'-' { OpStack.push(c); if(infix[i+1]=='-') { binary_treetemp; temp.root=build_node("0"); NodeStack.push(temp); OpStack.push('-'); ++i; } } elseif(c==')') { while(OpStack.top()! ='(') { binary_treetemp_tree; stringthisstring=""; thisstring=thisstring+OpStack.top(); OpStack.pop(); etree.root=build_node(thisstring); copy(temp_tree.root,NodeStack.top().root); NodeStack.pop(); etree.root->right_child=temp_tree.root; temp_tree.root=NULL; copy(temp_tree.root,NodeStack.top().root); 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.pop(); } } while(! OpStack.empty()) { binary_treetemp_tree; stringthisstring=""; thisstring=thisstring+OpStack.top(); OpStack.pop(); etree.root=build_node(thisstring); copy(temp_tree.root,NodeStack.top().root); NodeStack.pop(); etree.root->right_child=temp_tree.root; temp_tree.root=NULL; copy(temp_tree.root,NodeStack.top().root); etree.root->left_child=temp_tree.root; NodeStack.pop(); temp_tree.root=NULL; copy(temp_tree.root,etree.root); NodeStack.push(temp_tree); if(! OpStack.empty()) etree.root=NULL; } cout<<"Postfixtraversal: "; etree.print(); cout< etree.evaluate(); cout<<"Theresultis: "< cout<<"------------------------------------------------"< cout< Enter "; cin>>choice; getchar(); } else { cout<<"**************************"< cout<<"ERROR: InvalidExprssion"< cout< Enter "; cin>>choice; getchar(); } } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 二叉 以及 算术 表达式 实现 四则运算 计算 功能 代码