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