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

本文介绍了一个简单的表达式解析及计算程序,通过递归下降解析器实现对包含加减乘除和幂运算的数学表达式的解析与计算。该程序支持括号改变运算优先级,并考虑了操作符的结合性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 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 }

 

转载于:https://www.cnblogs.com/algonote/p/7635818.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值