设计一个程序,把中缀表达式转换成一棵二叉树,然后通过后序遍历计算表达式的值
谁能帮帮忙写个C语言的算法...关键的把中缀表达式转为一颗二叉树...
如:8-((3+5)*(5-(6/2)))
((2 + 2 ) * 3 + 3 )/2
(2 + 2) * ( 2 + 2 )
这样的...
下面这个算法对于2*(2+2)*2这样的没问题,但是(2+2)*(2+2)就出问题了,主要是括号不知如何解决..
int create(btree &T,char exp[],int n){
char c;
int index,bracket;
int isBracket;
int num,stateint,nint;
int tag1,tag2;
if(exp[0]==' ' || exp[0]=='\t' || exp[0]=='\n') /*忽略掉左边的若干空字符*/
return create(T,exp+1,n-1);
if(exp[n-1]==' ' || exp[0]=='\t' || exp[0]=='\n') /*忽略掉右边的若干空字符*/
return create(T,exp,n-1);
if( exp[0]=='(' && exp[n-1]==')') /*忽略掉左右的成对括号*/
return create(T,exp+1,n-2);
bracket = 0;
index = n;
/*从后向前搜索,寻找到第一个不在括号中的优先级最低的运算符*/
for(int i=n-1;i>=0;i--){
c = exp[i];
if(c == ')'){
isBracket = 1;
bracket++;
}
if(c == '(')
bracket--;
if(bracket<0){
T = NULL;
return 0;
}
if(bracket>0)
continue;
if(c == '+' || c == '-')
if(index==n || exp[index]=='*' || exp[index]=='/')
index = i;
if(c=='*' || c=='/')
if(index == n)
index=i;
}
if(bracket!=0)
return 0;
if(index == n){
if(isBracket == 1){
T = NULL;
return 0;
}
nint = 0;
stateint = 0;
num = 0;
for(i=0;i<n;i++){
c = exp[i];
switch(c){
case'0':case'1':case'2':case'3':case'4':
case'5':case'6':case'7':case'8':case'9':
if(stateint == 0){
num = c - '0';
stateint = 1;
nint++;
}
else{
num = num*10+c-'0';
}
break;
case ' ':case '\t': case '\n':
stateint = 0;
break;
default:
T = NULL;
return 0;
}
}
if(nint!=1){
T = NULL;
return 0;
}
T = (btree)malloc(sizeof(bnode));
T->data = num;
T->lchild = NULL;
T->rchild = NULL;
return 1;
}
T = (btree)malloc(sizeof(bnode));
T->data=exp[index];
tag1 = create(T->lchild,exp,index);
tag2 = create(T->rchild,exp+index+1,n-index-1);
if(tag1 == 1 && tag2 == 1 )
return 1;
return 0;
}