算术表达式的转换
Time Limit: 1000MS Memory limit: 65536K
题目描述
输入
输出
示例输入
a*b+(c-d/e)*f#
示例输出
+*ab*-c/def a*b+c-d/e*f ab*cde/-f*+
课程作业吧。
类似于吧、、、、不过现在解决啦,在刘汝佳写的一本书里找到了答案。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 1000+10 int lc[maxn],rc[maxn],nc=0;//每个结点的左右儿子编号和字符 char jc[maxn];//结点数 //表达式树 int build(char *s,int x,int y) { int i,c1 =-1,c2=-1,p=0,u; printf("%d %d\n",x,y); if(y-x==1) { u=++nc; lc[u] = rc[u]=0; jc[u]=s[x]; return u; } for(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 build(s,x+1,y-1);//整个表达式被一对括号括起来 u=++nc; lc[u]=build(s,x,c1); rc[u]=build(s,c1+1,y); jc[u]=s[c1]; return u; } void preorder(int u) { if(u) { printf("%c",jc[u]); preorder(lc[u]); preorder(rc[u]); } } void inorder(int u) { if(u) { inorder(lc[u]); printf("%c",jc[u]); inorder(rc[u]); } } void postorder(int u) { if(u) { postorder(lc[u]); postorder(rc[u]); printf("%c",jc[u]); } } int main() { char s[maxn]; scanf("%s",s); int u=build(s,0,strlen(s)-1); preorder(u); printf("\n"); inorder(u); printf("\n"); postorder(u); printf("\n"); return 0; }