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