http://poj.org/problem?id=1686
表达式求值的问题,给定两个表达式,问两者是否算术相等。用两个栈,一个存放操作符,一个存放数,进行表达式的求值,并判断两者是否相等。第一个表达式求值的题目,^ ^..
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int T ,len1,len2 , plus ;
char s1[85],s2[85] ;
int optr[85] , opnd[85] ,top1, top2;
void push2(char c){
optr[top1++] = c ;
}
char pop2(){
char c ;
c = optr[top1-1] ;
top1-- ;
return c ;
}
void push1(int num){
opnd[top2++] = num ;
}
int pop1(){
top2-- ;
return opnd[top2] ;
}
bool check(char c){
if(c=='+' || c=='-' || c=='*' || c=='/' || c=='(' || c==')' || c=='#')
return true ;
else
return false ;
}
int cal(char a, char b){
int r ;
switch(b){
case '+':
case '-':
if(a=='(' || a=='#')
r = -1 ; //入栈
else
r = 1 ; //计算
break ;
case '*':
case '/':
if(a=='*' || a=='/' || a==')')
r =1 ; //计算
else
r = -1 ; //入栈
break ;
case '(':
if(a == ')'){
printf("error!\n");
exit(1) ;
}
else{
r = -1 ; //入栈
}
break ;
case ')':
if(a == '(')
r = 0 ;
else
r = 1 ;
break ;
case '#':
if(a=='#')
r = 0 ;
else
r = 1 ;
break ;
}
return r ;
}
int calculate(int a, int b , char c){
int res ;
switch(c){
case '+': res = a + b ; break ;
case '-': res = a - b ; break ;
case '*': res = a * b ; break ;
case '/': res = a / b ; break ;
}
return res ;
}
int solve(char s[] , int plus,int len){
char c ,opr ,e ;
int i, j ;
i = 0 ;
push2('#');
while(i<=len){
c = optr[top1-1] ;
if(isdigit(s[i])){
push1(s[i]-'0') ;
i++ ;
}
else if(isalpha(s[i])){
push1(s[i]-'a'+plus) ;
i++ ;
}
else{
if(check( s[i] )){
switch( cal(c,s[i]) ){
case 0:
pop2();
i ++ ;
break ;
case -1 :
push2(s[i]);
i++ ;
break ;
case 1 :
opr = pop2();
int a = pop1();
int b = pop1() ;
push1( calculate(b,a,opr) );
break ;
}
}
else
i++ ;
}
}
return opnd[top2-1] ;
}
int main(){
scanf("%d",&T);
getchar();
for(int cas = 1;cas<=T;cas++){
gets(s1); gets(s2) ;
len1 = strlen(s1) ;
len2 = strlen(s2) ;
s1[len1] = '#' ;
s2[len2] = '#' ;
plus = 10 ;
top1 = top2 = 0 ;
int res1 = solve(s1,plus,len1) ;
int res2 = solve(s2,plus,len2) ;
if(res1 != res2){
printf("NO\n");
}
else
printf("YES\n");
}
return 0 ;
}