[Coursera]数据结构基础_Week3_栈与队列_Q3

#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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值