解析算式基本不可能了,因为想要用程序将一个算式化成最简形式是比较复杂的,因此考虑使用特殊数代入的方式,那么问题就归结为如何计算一个算式,首先需要把变量编号并赋予变量随机值,然后分治计算算式。将算式分段的位置就在于符号优先级最小的最右边的符号,整个计算过程是一个层次结构,首先进行优先级最高的,再进行优先级次高的。使用记录括号层次的方法计算符号的优先级。
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
char equ[2][100];
int tag[26];
int id[26];
int rval[26];
int num;
int caculate(char* str,int b,int e){
int layer=0;
int opm=9999;
int i,k;
int posi = 0;
int numop = 0;
int num[2];
for(i=b;i<=e;i++){
if(str[i] == '(' ){
layer++;continue;
}
if(str[i] == ')'){
layer--;continue;
}
if(str[i]=='*'&& opm >= 3*layer + 2){opm = 3*layer + 2;posi = i;}
if(str[i]=='-'&& opm >= 3*layer + 1){opm = 3*layer + 1;posi = i;}
if(str[i]=='+'&& opm >= 3*layer){opm = 3*layer;posi = i;}
if(str[i]=='*'||str[i]=='-'||str[i]=='+') numop++;
}
if(numop == 1){
for(i=b,k=0;i<=e&&k<2;i++){
if(str[i] >='a'&& str[i]<='z'){
num[k++] = rval[id[str[i]-'a']];
}else if(str[i]>='0' && str[i]<='9'){
num[k++] = str[i]-'0';
}else{
posi = i;
}
}
switch(str[posi]){
case '*': return num[0]*num[1];
case '-': return num[0]-num[1];
case '+': return num[0]+num[1];
}
}else if(numop == 0){
for(i=b;i<=e;i++){
if(str[i] >='a'&& str[i]<='z'){
return rval[id[str[i]-'a']];
}else if(str[i]>='0' && str[i]<='9'){
return str[i]-'0';
}
}
}else{
num[0] = caculate(str,b,posi-1);
num[1] = caculate(str,posi+1,e);
switch(str[posi]){
case '*': return num[0]*num[1];
case '-': return num[0]-num[1];
case '+': return num[0]+num[1];
}
}
}
bool isequal(){
int i;
for(i=0;i<num;i++)
rval[i] = rand();
return caculate(equ[0],0,strlen(equ[0])-1) == caculate(equ[1],0,strlen(equ[1])-1);
}
int main(){
int t,j,k;
int i;
char str[100];
cin >> t;
cin.getline(str,100);
while(t--){
num =0;
for(i=0;i<26;i++){
tag[i] = 0;
}
for(i=0;i<2;i++){
cin.getline(str,100);
for(j=0,k=0;j<strlen(str);j++){
if(str[j] == ' ') continue;
if(str[j]>='A'&&str[j]<='Z'){
str[j] = str[j] - 'A' + 'a';
}
if(str[j]>='a' && str[j] <='z'){
if(!tag[str[j]-'a']) tag[str[j]-'a'] = 1;
}
equ[i][k++] = str[j];
}
equ[i][k] = '/0';
}
for(i=0;i<26;i++){
if(tag[i]) id[i] = num++;
}
if(isequal()) cout<< "YES" << endl;
else cout << "NO" <<endl;
}
}