波兰式/中序表达式/逆波兰式生成表达式树并求值
part of infix notation
int num(char c){
int n;
switch (c)
{
case '+':
n=0;
break;
case '-':
n=1;
break;
case '*':
n=2;
break;
case '/':
n=3;
break;
case '(':
n=4;
break;
case ')':
n=5;
break;
case '#':
n=6;
break;
default:
n=7;
break;
}
return n;
}
int OperPreRe(char top,char ch){
int ntop,nch;
int Oper[7][7]={
1,1,0,0,0,1,1,
1,1,0,0,0,1,1,
1,1,1,1,0,1,1,
1,1,1,1,0,1,1,
0,0,0,0,0,2,3,
1,1,1,1,3,1,1,
0,0,0,0,0,3,2
};
ntop=num(top);
nch=num(ch);
if(nch==7||ntop==7){
return 4;
}
else{
return Oper[ntop][nch];
}
}
void InExpress(BinThrTree &T){
stack<BinThrTree> OPTR,EXPT;
char ch;
BinThrTree par;
int n;
cin>>ch;
par=new BinThrNode;
par->data=ch,par->lchild=par->rchild=NULL;
OPTR.push(par);
cin>>ch;
while(1){
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#'){
switch (OperPreRe(OPTR.top()->data,ch))
{
case 0:
par=new BinThrNode;
par->data=ch,par->lchild=par->rchild=NULL;
OPTR.push(par);
cin>>ch;
break;
case 1:
OPTR.top()->rchild=EXPT.top();
EXPT.pop();
OPTR.top()->lchild=EXPT.top();
EXPT.pop();
EXPT.push(OPTR.top());
OPTR.pop();
T=EXPT.top();
if(ch!='#'&&ch!=')'){
par=new BinThrNode;
par->data=ch;
par->lchild=par->rchild=NULL;
OPTR.push(par);
cin>>ch;
}
break;
case 2:
OPTR.pop();
if(ch=='#'){
cout<<"complete\n";
return;
}
cin>>ch;
break;
default:
cout<<"error\n";
return;
}
}
else{
par=new BinThrNode;
par->data=ch,par->lchild=par->rchild=NULL;
EXPT.push(par);
cin>>ch;
}
}
return;
}