标签:
Description
Input
Output
Sample Input
3 (a+b-c)*2 (a+a)+(b*2)-(3*c)+c a*2-(a+c)+((a+c+e)*2) 3*a+c+(2*e) (a-b)*(a-b) (a*a)-(2*a*b)-(b*b)
Sample Output
YES YES NO
题意:
给出两个数学式子判断其结果是否相等。
解法:
1,用栈将表达式转换成为后缀式,然后计算后缀表达式的只判断其是否相等。
2,字母转换之后算其值来代表其字母的值,直接将其ASCII作为数值对待,这个题只是判断两个表达式是否在数值上是等价的而不是判断两个公式是否等价,一直很疑惑,查了一下发现比如说:(b-a+c)*2 与 (1+c)*2也相等,但是如果作为公式的话这两个是不相等的.
3.从程序看出,要先判断字符(juge),然后依次输入(in),然后计算出(put),最后输出(out)结果。
4.注意格式,空格或tab!
经过一番搜寻加完善的AC代码:
#include<iostream> #include<fstream> #include<stack> #include<cstring> #include<map> using namespace std; char c1[500],c2[500]; char s1[500],s2[500],s[500]; int a[100]; int juge(char c) //判断 { if(c>=‘0‘&&c<=‘9‘) return 1; if(c>=‘a‘&&c<=‘z‘) return 1; else return 0; } void in(char c[]) //输入 { int i,j=0; stack<char> q; for(i=0;i<strlen(c);i++) { if(juge(c[i])) s[j++]=c[i]; else if(c[i]==‘(‘) q.push(c[i]); else if(c[i]==‘)‘) { while(q.top()!=‘(‘) { s[j++]=q.top(); q.pop(); } q.pop(); } else if(c[i]==‘+‘||c[i]==‘-‘||c[i]==‘*‘) { while(!q.empty()&&a[c[i]]<=a[q.top()]) { s[j++]=q.top(); q.pop(); } q.push(c[i]); } } while(!q.empty()) { s[j++]=q.top(); q.pop(); } s[j]=‘\0‘; //特别注意,很容易遗漏 } int put(char s1[]) //计算出值 { int i,j,k; stack<int> q; for(i=0;i<strlen(s1);i++) { if(juge(s1[i])) { if(s1[i]>=‘0‘&&s1[i]<=‘9‘) q.push(s1[i]-‘0‘); else q.push(s1[i]); } else { j=q.top(); q.pop(); k=q.top(); q.pop(); if(s1[i]==‘+‘) j=j+k; if(s1[i]==‘-‘) j=k-j; if(s1[i]==‘*‘) j=k*j; q.push(j); } } return q.top(); } void out() //输出比较 { a[‘+‘]=1; a[‘-‘]=1; a[‘*‘]=2; a[‘(‘]=0; int i,j,t; cin>>t; getchar(); while(t--){ cin.getline(c1,500); cin.getline(c2,500); in(c1); strcpy(s1,s); in(c2); strcpy(s2,s); i=put(s1); j=put(s2); if(i==j) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } int main() { out(); return 0; }
标签:
原文地址:http://www.cnblogs.com/hfc-xx/p/4663558.html