#include <stdio.h> |
002 | #include <ctype.h> |
003 | #include <string.h> |
004 | int num[100]; |
005 | char op[100]; |
006 | int numcou = 0; |
007 | int opcou = 0; |
008 | void pushnum( int n) |
009 | { |
010 | num[numcou++] = n; |
011 | } |
012 | void pushop( char c) |
013 | { |
014 | op[opcou++] = c; |
015 | } |
016 | int numpop() |
017 | { |
018 | return num[--numcou]; |
019 | } |
020 | char oppop() |
021 | { |
022 | return op[--opcou]; |
023 | } |
024 | char opc[7] = { '+' , '-' , '*' , '/' , '(' , ')' , '#' }; |
025 | int p[7][7] = { |
026 | {1,1,-1,-1,-1,1,1}, |
027 | {1,1,-1,-1,-1,1,1}, |
028 | {1,1,1,1,-1,1,1}, |
029 | {1,1,1,1,-1,1,1}, |
030 | {-1,-1,-1,-1,-1,0,-2}, |
031 | {1,1,1,1,-2,1,1}, |
032 | {-1,-1,-1,-1,-1,-2,0} |
033 | }; |
034 | int pri( char s, char e) |
035 | { |
036 | int i, j, k; |
037 | for (i=0; i<7; i++) |
038 | { |
039 | if (s == opc[i]) |
040 | j = i; |
041 | if (e == opc[i]) |
042 | { |
043 | k = i; |
044 | } |
045 | } |
046 | return p[j][k]; |
047 | } |
048 | int result( int first, int second, char c) |
049 | { |
050 | switch (c) |
051 | { |
052 | case '+' : |
053 | return first + second; |
054 | break ; |
055 | case '-' : |
056 | return first - second; |
057 | break ; |
058 | case '*' : |
059 | return first * second; |
060 | break ; |
061 | case '/' : |
062 | return first / second; |
063 | break ; |
064 | } |
065 | } |
066 | int calc( char * exp ) |
067 | { |
068 | char c; |
069 | int first; |
070 | int second; |
071 | numcou = 0; |
072 | opcou = 0; |
073 | pushop( '#' ); |
074 | while (* exp != '#' || op[opcou-1]!= '#' ) |
075 | { |
076 | if ( isdigit (* exp )) |
077 | { |
078 | pushnum(* exp - '0' ); |
079 | exp ++; |
080 | continue ; |
081 | } |
082 | else if ( isalpha (* exp )) |
083 | { |
084 | pushnum(* exp - 'a' +10); |
085 | exp ++; |
086 | continue ; |
087 | } |
088 | else if (* exp == '+' || * exp == '-' || * exp == '*' || * exp == '#' || * exp == '(' || * exp == ')' ) |
089 | { |
090 | switch (pri(op[opcou-1], * exp )) |
091 | { |
092 | case 1: |
093 | c = oppop(); |
094 | second = numpop(); |
095 | first = numpop(); |
096 | pushnum(result(first, second, c)); |
097 | break ; |
098 | case 0: |
099 | oppop(); |
100 | exp ++; |
101 | break ; |
102 | case -1: |
103 | pushop(* exp ); |
104 | exp ++; |
105 | break ; |
106 | default : |
107 | break ; |
108 | } |
109 | } |
110 | else |
111 | exp ++; |
112 | |
113 | } |
114 | return num[numcou-1]; |
115 | } |
116 | int main() |
117 | { |
118 | int n, len; |
119 | char fir[100], sec[100]; |
120 | while ( scanf ( "%d" , &n)!=EOF) |
121 | { |
122 | getchar (); |
123 | while (n--) |
124 | { |
125 |
126 | gets (fir); |
127 | len = strlen (fir); |
128 | fir[len] = '#' ; |
129 | gets (sec); |
130 | len = strlen (sec); |
131 | sec[len] = '#' ; |
132 | if (calc(fir) == calc(sec)) |
133 | printf ( "YES\n" ); |
134 | else |
135 | printf ( "NO\n" ); |
136 | } |
137 | } |
138 | return 0; |
139 | } |