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;
}

posted on 2011-05-09 14:51  宇宙吾心  阅读(393)  评论(0编辑  收藏  举报

导航