这是一道表达式求值问题,用到表达式树的知识;
但归根结底还是第归!!!!
我是开了被人的代码才写出来的,主要原因是第归理解的不好!!!
以后一定要加强对第归的理解和代码生成!!!
#include<iostream>
#include<string>
#include<stdio.h>
#include<math.h>
#define MAXN 10005
using namespace std;
string s;
int nc;
double build_tree(int x,int y){
int i,c1=-1,c2=-1,c3=-1,p=0;
int flag1=1;int flag0=1;
double num=0;double digit=10;
double temp1,temp2;
for(int i=x;i<y;i++){
switch(s[i]){
case '(':p++;flag0=0;break;
case ')':p--;flag0=0;break;
case '+':case'-':if(!p) c1=i;flag0=0;break;
case '*':case'/':if(!p) c2=i;flag0=0;break;
case '^':if(!p) c3=i;flag0=0;break;//觉得测试数据有问题(^有右结合性)应为if(!p&&c2==-1);
case '.': flag1=0; break;
default : if(flag1) {num=num*10+s[i]-'0';}
else {num=num+(s[i]-'0')/digit;digit*=10;}
break;
}
}
if(flag0) return num;//如果没有运算符就直接返回值,有运算符时num是无用的
//递归到最后计算的运算符时才算!!!
if(c1<0) c1=c2;
if(c1<0) c1=c3;
if(c1<0) return build_tree(x+1,y-1);
//计算当前运算
if(c1==x) temp1=0;//如果第一个字符是运算符(+,0)就把templ=0;
else temp1=build_tree(x,c1);
temp2=build_tree(c1+1,y);
switch(s[c1]){
case '+': return temp1+temp2;break;
case'-': return temp1-temp2;break;
case '*': return temp1*temp2 ;break;
case'/': if(temp2==0.0) return nc=1;return temp1/temp2;break;
case '^':return pow(temp1,temp2);break;
}
}
int main(){
while(cin>>s){
nc=0;
int y=s.length();
int x=0;
double temp=build_tree(x,y);
if(nc) cout<<"The teacher is so lazy!"<<endl;
else printf("%.8lf/n",temp);
}
return 0;}