poj 1686
判断两个表达式是否相同。
代码:
#include<iostream> #include<fstream> #include<stack> using namespace std; char c1[2000],c2[2000]; char s1[2000],s2[2000],s[2000]; int a[126]; int ok(char c){ if(c>='0'&&c<='9') return 1; if(c>='a'&&c<='z') return 1; return 0; } void solve(char c[]){ int i,j,k; j=0; stack<char> q; for(i=0;i<strlen(c);i++) { if(ok(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 compute(char s1[]){ int i,j,k; stack<int> q; for(i=0;i<strlen(s1);i++) { if(ok(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 read(){ // ifstream cin("in.txt"); int i,j,k; int cas; a['+']=1; a['-']=1; a['*']=2; a['(']=0; cin>>cas; getchar(); while(cas--){ cin.getline(c1,2000); cin.getline(c2,2000); solve(c1); strcpy(s1,s); solve(c2); strcpy(s2,s); i=compute(s1); j=compute(s2); if(i==j) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } int main(){ read(); return 0; }