题目大意:
类似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; }