#include <iostream>
#include <stack>
#include <map>
#include <string.h>
using namespace std ;
char s1[100] ;
map<char,int>m ;
bool IsChar( char ch )
{
if(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' ||
ch >= '1' && ch <= '9' )
return true;
else
return false;
}
void Change( char ch[] )
{
stack<char> s ;
int len = strlen( ch ) ;
int i , j = 0 ;
for ( i = 0 ; i < len ; i++ )
{
if ( IsChar( ch[i] ) )
{
s1[j++] = ch[i] ;
}
else
{
switch( ch[i] )
{
case '(' :
s.push( ch[i] ) ;
break ;
case ')' :
while ( s.top() != '(' )
{
s1[j++] = s.top() ;
s.pop() ;
}
s.pop() ;
break ;
case '+' :
case '-' :
case '*' :
while ( !s.empty() && m[s.top()] >= m[ch[i]] )
{
s1[j++] = s.top() ;
s.pop() ;
}
s.push(ch[i]) ;
break ;
}
}
}
while ( !s.empty() )
{
s1[j++] = s.top() ;
s.pop() ;
}
s1[j] = 0 ;
// cout << s1 << endl ;
}
int Result()
{
// int num ;
stack<int> s ;
int len = strlen(s1) , i ;
for ( i = 0 ; i < len ; i++ )
{
if ( IsChar(s1[i]) )
{
if ( s1[i] >= '1' && s1[i] <= '9' )
s.push( s1[i]-'0' ) ;
else
{
s.push( (int)s1[i] ) ;
// cout << int(s1[i] ) << endl ;
}
}
else
{
int a , b ;
a = s.top() ;
s.pop() ;
b = s.top() ;
s.pop() ;
switch( s1[i] )
{
case '+' :
s.push(a+b) ;
break ;
case '-' :
s.push(b-a) ;
break ;
case '*' :
s.push(a*b) ;
break ;
}
}
}
return s.top() ;
// return num ;
}
int main()
{
int N ;
char ch1[100] , ch2[100] ;
cin >> N ;
m['+']=1;
m['-']=1;
m['*']=2;
m['(']=0;
cin.getline( ch1 , 100 , '\n' ) ;
while ( N-- )
{
cin.getline( ch1 , 100 , '\n' ) ;
cin.getline( ch2 , 100 , '\n' ) ;
int n1 , n2 ;
Change( ch1 ) ;
n1 = Result() ;
// cout << n1 << endl ;
Change( ch2 ) ;
n2 = Result() ;
// cout << n2 << endl ;
if ( n1 == n2 )
cout << "YES" << endl ;
else
cout << "NO" << endl ;
}
return 0 ;
}
转自网络。此人将字母视作ASC码计算,故a=b-1输出YES,然而AC。
[Coursera]数据结构基础_Week3_栈与队列_Q3
最新推荐文章于 2018-11-05 23:14:59 发布