实用参考四则运算表达式求值实验报告docxWord文档格式.docx
《实用参考四则运算表达式求值实验报告docxWord文档格式.docx》由会员分享,可在线阅读,更多相关《实用参考四则运算表达式求值实验报告docxWord文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
输出
后缀表达式为:
//输出结果的位置
表达式的值为:
三、调试分析
本次实验的难点主要是在建立二叉树的问题上。
关于如何把中缀表达式存入二叉树中,我参考了网上的一些方法,成功实现了目标,但是却遇到了一个问题,那就是不能处理小数,甚至两位或两位以上的整数。
因为如果采用字符数组来存储操作数,运算符合一位整数还可以处理,但对于两位数就就会出问题,最后我改进采用字符串数组来存储操作数,成功解决了问题。
另外在处理输入的非法表达式问题中,我也费了很大功夫,但总体问题不大。
四、测试结果
五、用户使用说明(可选)
1、运行程序时
提示输入四则运算表达式
本程序可以将中缀表达式转化为后缀表达式,并计算结果
请输入四则运算表达式:
输出
后缀表达式为:
程序源代码(c++)
#include<
iostream>
string>
stack>
iomanip>
constintMaG=100;
usingnamespacestd;
classNode{
public:
charch[MaG];
//考虑到数值有时会是两位数,所以使用字符串数组
NodeGlChild;
NodeGrChild;
Node(){
strcpP(ch,"
"
);
lChild=rChild=NULL;
}
~Node(){
if(lChild!
=NULL)
deletelChild;
if(rChild!
deleterChild;
};
staticintcount=0;
staticchararraP[MaG];
//保存原始的中缀表达式
staticcharstr[2GMaG];
//保存后序遍历出来的字符串,为表达式求值提供方便
staticintk=0;
chargetOp(NodeGtemp);
//temp指针保存每个结点,返回的是运算符
NodeGcrtTree(NodeGroot);
//传入根结点指针,返回根结点指针
voidoutput(NodeGroot);
//获得处理后的字符串
boolisError(char);
//判断字符是否有问题
voiddeal();
//对字符数组进行处理
doublevalue(string);
//计算后缀表达式,得到其结果。
intmain(){
NodeGroot=NULL;
cout<
<
输入中缀表达式:
;
cin.getline(arraP,40);
deal();
root=crtTree(root);
输出后缀表达式:
output(root);
str<
endl;
输出后缀表达式的值:
if(value(str)!
=0)
cout<
fiGed<
setprecision
(2)<
value(str)<
else
AWrongInput!
return0;
}
//将数字字符存入一个结点,并返回数字字符的后一个符号
chargetOp(NodeGtemp){
inti=0;
if(isError(arraP[count]))
eGit(0);
while(arraP[count]<
='
9'
&
arraP[count]>
0'
||arraP[count]=='
.'
){
temp->
ch[i]=arraP[count];
i++;
count++;
temp->
ch[i]='
\0'
count++;
returnarraP[count-1];
NodeGcrtTree(NodeGroot){
NodeGp,Gq;
charop;
if(root==NULL){
root=newNode;
p=newNode;
op=getOp(root);
while(op!
q=newNode;
q->
ch[0]=op;
ch[1]='
switch(op)
{
case'
+'
:
-'
q->
lChild=root;
root=q;
p=newNode;
op=getOp(p);
root->
rChild=p;
break;
G'
/'
if(root->
ch[0]=='
||root->
p=newNode;
strcpP(p->
ch,root->
ch);
p->
rChild=q;
op=getOp(root);
root=p;
}else{
q->
root=q;
op=getOp(p);
root->
}break;
('
p=root;
while(p->
rChild)
p=p->
rChild;
if(p->
lChild==NULL){
lChild=crtTree(p->
lChild);
//递归创建括号里的指针
op=arraP[count];
count++;
break;
rChild=crtTree(p->
rChild);
}
)'
returnroot;
}
returnroot;
//传入根结点,后序遍历,赋值给另一个字符数组(主要是为了给后序的计算表达式值提供方便)
voidoutput(NodeGroot){
intn;
if(root){
output(root->
n=0;
while(root->
ch[n]!
)
str[k++]=root->
ch[n++];
str[k++]='
'
boolisError(charch){//判断每个字符是否有错
if(ch!
ch!
!
(ch<
ch>
)&
字符错误!
returntrue;
returnfalse;
voiddeal(){//对字符数组进行处理
inti=0,n=0;
while(arraP[i]){
if(arraP[i]=='
||arraP[i]=='
i++;
arraP[n++]=arraP[i++];
arraP[n++]='
arraP[n]='
doublevalue(strings2){//计算后缀表达式,得到其结果。
stack<
double>
s;
doubleG,P;
inti=0;
while(i<
s2.length()){
if(s2[i]=='
i++;
switch(s2[i])
if(s.size()>
=2){
G=s.top();
s.pop();
G+=s.top();
break;
else
return0;
G=s.top()-G;
else
GG=s.top();
if(s.top()==0)return0;
else{
G=s.top();
G=s.top()/G;
}
default:
G=0;
while('
=s2[i]&
s2[i]<
G=GG10+s2[i]-'
i++;
if(s2[i]=='
doublek=10.0;
P=0;
while('
P+=((s2[i]-'
)/k);
i++;
kG=10;
G+=P;
if(G!
s.push(G);
if(s.size()==1)
returns.top();
return0;
六、实验结论
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG