1、根据中缀表达式构造二叉树,再后序遍历求出后缀表达式。
#include<iostream>
#include<string>
using namespace std;
//根据中缀表达式求出后缀表达式
typedef struct node
{
string v;
node *l;
node *r;
};
void In2T(string In,node *&T)
{
if(T==NULL)
{
T=new node;
T->l=T->r=NULL;
}
int op=9999999,idx=-1,ex=0; //a+(b+c)*d+e
for(int i=In.length()-1; i>=0; i--) //找出优先级最低的运算符的位置,优先级越低深度越低
{
if(In[i]==')')
ex+=2;
else if(In[i]=='(')
ex-=2;
else if(In[i]=='+'||In[i]=='-')
{
if(ex+1<op)
{
op=ex+1;
idx=i;
}
}
else if(In[i]=='*'||In[i]=='/')
{
if(ex+2<op)
{
op=ex+2;
idx=i;
}
}
}
if(idx==-1)//没有运算符只有括号和数字
{
int idx1,idx2;
for(idx1=0; idx1<In.length(); ++idx1)
if(In[idx1]!='(')
break;
for(idx2=In.length()-1; idx2>=0; --idx2)
if(In[idx2]!=')')
break;
T->v=In.substr(idx1,idx2-idx1+1);
return ;
}
T->v=In[idx];
In2T(In.substr(0,idx),T->l);
In2T(In.substr(idx+1,In.length()-idx),T->r);
}
void dfs(node* T)
{
if(T==NULL)
return;
dfs(T->l);
dfs(T->r);
cout<<T->v;
}
int main()
{
string In;
node *root=NULL;
getline(cin,In);
In2T(In,root);
dfs(root);
cout<<endl;
return 0;
}
2、根据后缀表达式构造二叉树。
#include<iostream>
#include<vector>
#include<string>
using namespace std;
typedef struct node
{
char v;
node* l;
node* r;
};
void dfs(node* &root)
{
if(root==NULL)
return ;
dfs(root->l);
cout<<root->v;
dfs(root->r);
}
int main()
{
string In;
getline(cin,In);
node* root=NULL;
vector<node*> stk;
for(int i=0; i<In.size(); ++i)
{
node* t=new node;
t->v=In[i];
t->l=t->r=NULL;
if(In[i]=='+'||In[i]=='-'||In[i]=='*'||In[i]=='/')
{
int s=stk.size();
node* tl=stk[s-2];
node* tr=stk[s-1];
stk.pop_back();
stk.pop_back();
t->l=tl;
t->r=tr;
stk.push_back(t);
}
else
stk.push_back(t);
root=t;
}
dfs(root);
return 0;
}
3、输入表达式,输出值。分两种情况:中缀表达式和后缀表达式。
中缀表达式求值:先将中缀表达式建立二叉树转后缀表达式,然后再求值。
#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;
}