这里是代码,现在测试[3+6*(1+8)]/10这个例子是11.7,但把14行cout注释后,代码就输出5.7了。
#include<bits/stdc++.h>
using namespace std;
struct Node{string str;int Level[1005];} e;
double str_to_num(string str){
double num,w=1;bool flag=false;
for(auto c:str){
if(c=='.') flag=true;
else if(flag==true) w/=10,num+=w*(c-'0');
else num=num*10+c-'0';
}
return num;
}
double dfs(Node formula){
//cout<<"";
int min_id=0;bool flag=false;
for(int i=0;i<formula.str.length();i++){
if(formula.Level[i]!=100){
flag=true;
if(formula.Level[i]<formula.Level[min_id]) min_id=i;
}
}
if(!flag) return str_to_num(formula.str);
Node sub1,sub2;
sub1.str=formula.str.substr(0,min_id);
sub2.str=formula.str.substr(min_id+1,formula.str.length()-min_id-1);
for(int i=0;i<min_id;i++)
sub1.Level[i]=formula.Level[i];
for(int i=min_id+1,j=0;i<formula.str.length();i++,j++){
sub2.Level[j]=formula.Level[i];
}
switch(formula.str[min_id]){
case('+'): return dfs(sub1)+dfs(sub2);
case('-'): return dfs(sub1)-dfs(sub2);
case('*'): return dfs(sub1)*dfs(sub2);
case('/'): return dfs(sub1)/dfs(sub2);
}
}
int main(){
string str;cin>>str;
int flag=0;
for(int i=0;i<str.length();i++){
if(str[i]=='('||str[i]=='['||str[i]=='{') flag+=2;
else if(str[i]==')'||str[i]==']'||str[i]=='}') flag-=2;
else if(str[i]=='+'||str[i]=='-'){
e.Level[e.str.length()]=0+flag;
e.str.insert(e.str.length(),1,str[i]);
}
else if(str[i]=='*'||str[i]=='/'){
e.Level[e.str.length()]=1+flag;
e.str.insert(e.str.length(),1,str[i]);
}
else{
e.Level[e.str.length()]=100;
e.str.insert(e.str.length(),1,str[i]);
}
}
printf("%.6f",dfs(e));
return 0;
}
并且把16行判断条件更改成这样后,代码又神奇的运行正确了。
#include<bits/stdc++.h>
using namespace std;
struct Node{string str;int Level[1005];} e;
double str_to_num(string str){
double num,w=1;bool flag=false;
for(auto c:str){
if(c=='.') flag=true;
else if(flag==true) w/=10,num+=w*(c-'0');
else num=num*10+c-'0';
}
return num;
}
double dfs(Node formula){
int min_id=0;bool flag=false;
for(int i=0;i<formula.str.length();i++){
if(formula.str[i]=='+'||formula.str[i]=='-'||formula.str[i]=='*'||formula.str[i]=='/'){
flag=true;
if(formula.Level[i]<formula.Level[min_id]) min_id=i;
}
}
if(!flag) return str_to_num(formula.str);
Node sub1,sub2;
sub1.str=formula.str.substr(0,min_id);
sub2.str=formula.str.substr(min_id+1,formula.str.length()-min_id-1);
for(int i=0;i<min_id;i++)
sub1.Level[i]=formula.Level[i];
for(int i=min_id+1,j=0;i<formula.str.length();i++,j++){
sub2.Level[j]=formula.Level[i];
}
switch(formula.str[min_id]){
case('+'): return dfs(sub1)+dfs(sub2);
case('-'): return dfs(sub1)-dfs(sub2);
case('*'): return dfs(sub1)*dfs(sub2);
case('/'): return dfs(sub1)/dfs(sub2);
}
}
int main(){
string str;cin>>str;
int flag=0;
for(int i=0;i<str.length();i++){
if(str[i]=='('||str[i]=='['||str[i]=='{') flag+=2;
else if(str[i]==')'||str[i]==']'||str[i]=='}') flag-=2;
else if(str[i]=='+'||str[i]=='-'){
e.Level[e.str.length()]=0+flag;
e.str.insert(e.str.length(),1,str[i]);
}
else if(str[i]=='*'||str[i]=='/'){
e.Level[e.str.length()]=1+flag;
e.str.insert(e.str.length(),1,str[i]);
}
else{
e.Level[e.str.length()]=100;
e.str.insert(e.str.length(),1,str[i]);
}
}
printf("%.6f",dfs(e));
return 0;
}