输入表达式,输出值。分两种情况:中缀表达式和后缀表达式。中缀表达式求值:先将中缀表达式建立二叉树转后缀表达式,然后再求值。
code
#include <iostream>
#include <string>
#include <string.h>
#include <math.h>
#include <stdlib.h>
using namespace std;
string s[105];
int n=0;
struct node
{
string v;
node *l;
node *r;
};
void dfs(node *T)
{
if(T==NULL)
return ;
dfs(T->l);
dfs(T->r);
// cout<<T->v;
s[n++]=T->v;
}
void f(string str,node *&T)
{
if(T==NULL)
{
T=new node;
T->l=T->r=NULL;
}
int op=9999,ex=0,idx=-1;
for(int i=str.length()-1; i>=0; i--)
{
if(str[i]==')')
ex+=2;
else if(str[i]=='(')
ex-=2;
else if(str[i]=='+'||str[i]=='-')
{
if(ex+1<op)
{
op=ex+1;
idx=i;
}
}
else if(str[i]=='*'||str[i]=='/')
{
if(ex+2<op)
{
op=ex+2;
idx=i;
}
}
}
if(idx==-1)
{
int idx1,idx2;
for(idx1=0; idx1<str.length(); idx1++)
if(str[idx1]!='(')
break;
for(idx2=str.length()-1; idx2>=0; idx2--)
if(str[idx2]!=')')
break;
T->v=str.substr(idx1,idx2-idx1+1);
return ;
}
T->v=str[idx];//A+B
f(str.substr(0,idx),T->l);
f(str.substr(idx+1,str.length()-idx-1),T->r);
}
//12.23
double si(string s)//string转double
{
int i;
double sum1=0,sum2=0;
int st=-1;//小数点的位置
for(i=0; i<s.length(); i++)
{
if(s[i]=='.')
{
st=i;
break;
}
}
if(st==-1)
{
sum1=atof(s.c_str());
return sum1;
}
else
{
string t1=s.substr(0,st);
string t2=s.substr(st+1,s.length()-st-1);
sum1=atof(t1.c_str());
sum2=atof(t2.c_str());
return (sum1+sum2/pow(10,s.length()-st-1));
}
}
int main()
{
double a[105];
int i,num=0;
memset(a,0,sizeof(a));
node *root=NULL;
string str;
getline(cin,str);
f(str,root);
dfs(root);
cout<<"后缀表达式:"<<endl;
for(i=0; i<n; i++)
cout<<s[i];
cout<<endl;
cout<<"结果为:"<<endl;
for(i=0; i<n; i++)
{
if(s[i][0]>='0'&&s[i][0]<='9')
{
a[num++]=si(s[i]);
}
else if(s[i][0]=='+')
{
double t1=a[num-2];
double t2=a[num-1];
a[num-1]=0;
a[num-2]=0;
num-=2;
a[num++]=t1+t2;
}
else if(s[i][0]=='-')
{
double t1=a[num-2];
double t2=a[num-1];
a[num-1]=0;
a[num-2]=0;
num-=2;
a[num++]=t1-t2;
}
else if(s[i][0]=='*')
{
double t1=a[num-2];
double t2=a[num-1];
a[num-1]=0;
a[num-2]=0;
num-=2;
a[num++]=t1*t2;
}
else if(s[i][0]=='/')
{
double t1=a[num-2];
double t2=a[num-1];
a[num-1]=0;
a[num-2]=0;
num-=2;
a[num++]=t1/t2;
}
}
cout<<a[0]<<endl;
return 0;
}