表达式二叉树的问题...

隔夜_夕梦 2011-05-24 02:03:45
设计一个程序,把中缀表达式转换成一棵二叉树,然后通过后序遍历计算表达式的值

谁能帮帮忙写个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;
}
...全文
205 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
huzihack 2011-05-25
  • 打赏
  • 举报
回复
好牛哈
pandm 2011-05-25
  • 打赏
  • 举报
回复
ljsspace好牛逼啊。。。
ljsspace 2011-05-24
  • 打赏
  • 举报
回复
左右括号是对称的,用堆栈处理吧
ljsspace 2011-05-24
  • 打赏
  • 举报
回复
我刚用java随便写了个代码,贴在我的博客上:http://blog.csdn.net/ljsspace/archive/2011/05/24/6442921.aspx

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧