1 #include <cstdio> 2 #include <cstring> 3 int opt[3][2]={ 4 {'+','-'}, 5 {'*','/'}, 6 {'^'} 7 };//r为向右结合,l为向左结合 8 int optcnt[3]={2,2,1}; 9 int optdet[3]={'r','r','l'}; 10 char s[1001]; 11 int power(int a,int b) 12 { 13 int s=1; 14 while(b) 15 { 16 if (b&1) s*=a; 17 a*=a; 18 b/=2; 19 } 20 return s; 21 } 22 int calc(int a,int b,char c) 23 { 24 if (c=='+') return a+b; 25 if (c=='-') return a-b; 26 if (c=='*') return a*b; 27 if (c=='/') return a/b; 28 if (c=='^') return power(a,b); 29 } 30 int dfs(int l,int r)//解释表达式 31 { 32 if (l-1==r) return 0; 33 int isint=1,val=0;//判断是不是一个整数 34 for (int i=l;i<=r;i++) if (s[i]<'0'||s[i]>'9') isint=0;else val=val*10+s[i]-'0'; 35 if (isint) 36 { 37 printf("%d ",val); 38 return val; 39 } 40 //for (int i=l;i<=r;i++) printf("%c",s[i]); 41 //printf("\n"); 42 int wrap=0;//泡泡卷积层数 43 for (int i=0;i<3;i++)//判断优先级 44 { 45 int b,e,det; 46 //向右结合从左扫,向左结合从右扫 47 if (optdet[i]=='l') b=l,e=r+1,det=1;else b=r,e=l-1,det=-1; 48 for (int j=b;j!=e;j+=det) 49 { 50 //泡泡屏蔽 51 if (s[j]=='(') wrap++; 52 if (s[j]==')') wrap--; 53 if (wrap) continue; 54 //正常计算 55 for (int k=0;k<optcnt[i];k++) 56 if (s[j]==opt[i][k]) 57 { 58 int x=dfs(l,j-1),y=dfs(j+1,r); 59 int t=calc(x,y,s[j]); 60 printf("%c ",s[j]); 61 return t; 62 } 63 } 64 } 65 //如果到这里还没有返回,则说明整个表达式是一个稳定的泡泡(两边是一对完整的括号) 66 return dfs(l+1,r-1); 67 } 68 int main() 69 { 70 scanf("%s",s); 71 printf("\n%d",dfs(0,strlen(s)-1)); 72 }