用二叉树处理表达式

题目大意:

类似a+b*(c-d)-e/f

基本思路:

递归建立表达式树,优先级高的在深层次,注意括号,注意结合性,左结合就找优先级相同的当中在最右边的;

代码如下:

int nc=0;
int lch[maxn],rch[maxn];
char op[maxn];
int buildTree(char* s,int x,int y){
    int i,c1=-1,c2=-1,p=0,u;//c1代表+-位置,c2代表*/位置;
    if(y-x==1){//亲一个字符,建立单独节点;
        u=++nc;
        lch[u]=rch[u]=0;
        op[u]=s[x];
        return x;
    }
    for(int i=x;i<y;i++){
        switch(s[i]){
            case '(':p++;break;
            case ')':p--;break;
            case '+': case '-':if(!p) c1=i;break;
            case '*': case '/':if(!p) c2=i;break;
        }
    }
    if(c1<0) c1=c2;//找不到括号外的加减号,就用乘除号;
    if(c1<0) return buildTree(s,x+1,y-1);//整个表达式被一对括号括起来;
    u=++nc;
    lch[u]=buildTree(s,x,c1);
    rch[u]=buildTree(s,c1+1,y);
    op[u]=s[c1];
    return u;
}

 

posted @ 2018-02-13 23:01  愿~得偿所愿,不负时光  阅读(171)  评论(0编辑  收藏  举报