poj1686 Lazy Math Instructor

复制代码
 1 #include<map>
 2 #include<stack>
 3 #include<cctype>
 4 #include<iostream>
 5 using namespace std;
 6 map<char,int> m;  //从字符映射到数字 
 7 string s1,s2,r1,r2;
 8 string transform(string s)//把表达式转化为后缀表达式方便计算 
 9 {
10     int i,j,len;
11     char c[81];
12     stack<char> exp;  //定义一个字符栈,存放运算符 
13     len=s.length();
14     for(i=j=0;i<=len;++i){
15         if(isalnum(s[i])) c[j++]=s[i];  //如果是操作数直接到数组 
16         else{
17             switch(s[i]){
18                 case '(':
19                     exp.push(s[i]);
20                     break;
21                 case ')':
22                     while(exp.top()!='(')//碰到右括号,输出与前面左括号之间的所有
23                     {                    //字符,无需 !exp.empty(),因为括号成对 
24                         c[j++]=exp.top();
25                         exp.pop();
26                     }
27                     exp.pop();  //左括号出栈 
28                     break;
29                 case '+':
30                 case '-':
31                 case '*':
32                     while(!exp.empty()&&m[s[i]]<=m[exp.top()]){
33                         c[j++]=exp.top();  //优先级大的出栈 
34                         exp.pop();
35                     }
36                     exp.push(s[i]);//把当前运算符入栈 
37             }
38         }
39     }
40     while(!exp.empty()){  //输出剩余的运算符,'!'忘写了纠结半天 
41         c[j++]=exp.top();
42         exp.pop();
43     }
44     c[j]='\0';
45     string temp=c;  //需转化为string型 
46     return temp;            
47 }
48 int calculate(string r)//计算后缀表达式的值,字母用其ASC代替 
49 {
50     int i,len,a,b;
51     stack<int> cal;
52     len=r.length();
53     for(i=0;i<len;++i){
54         if(isalnum(r[i])) {
55             if(isdigit(r[i])) cal.push(r[i]-'0');
56             else cal.push(r[i]);
57         }
58         else{//碰到运算符,出栈两个数,运算结果再入栈 
59             a=cal.top(); 
60             cal.pop();
61             b=cal.top();
62             cal.pop();
63             switch(r[i]){
64                 case '+':
65                     cal.push(b+a);
66                     break;
67                 case '-':
68                     cal.push(b-a);
69                     break;
70                 case '*':
71                     cal.push(b*a);
72             }
73         }
74     }
75     return cal.top(); //栈顶元素就是最终的计算结果 
76 }
77 int main()
78 {
79     int T;
80     m['(']=0;
81     m['+']=m['-']=1;
82     m['*']=2;
83     cin>>T;
84     cin.get();//跳过一个回车 
85     while(T--){
86         getline(cin,s1);
87         getline(cin,s2);
88         r1=transform(s1);
89         r2=transform(s2);
90         if(calculate(r1)==calculate(r2)) cout<<"YES\n";
91         else cout<<"NO\n";
92     }
93     return 0;
94 }
复制代码

这个题一开始看到,是比较两个带参的表达式是否相等,不知所措,最后在网上看了别人的代码,才知道需要把里字母换成具体的数字才行,看到别人用的都是系统带的栈,我也用了一下,从中学到不少东西!也发现自己需要学习的还很多很多,加油!!!

 

posted on   小花熊  阅读(612)  评论(1编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
< 2012年8月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

导航

统计

点击右上角即可分享
微信分享提示