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 2012-08-07 21:32  小花熊  阅读(604)  评论(1编辑  收藏  举报

导航