码迷,mamicode.com
首页 > 其他好文 > 详细

中缀表达式转后缀表达式模板

时间:2017-10-07 21:19:53      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:判断   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!