这个题真是简直了。。。。。
不得不说java智能了。。恩
#include <cstdio> #include <cstring> #include <stack> #include <stdlib.h> #include<ctype.h> using namespace std; const int maxn=int (1e5)+5; stack <int> num; stack <char> op; int priv[127],val[27]; void init() { while(!num.empty()) num.pop(); priv['+']=priv['-']=3; priv['*']=priv['/']=2; priv['(']=10;//特殊处理 } int calc(int a,int b,char op) { if(op=='+') return a+b; if(op=='-') return a-b; if(op=='*') return a*b; } void calc() { int y=num.top(); num.pop(); int x=num.top(); num.pop(); char tmpop=op.top(); op.pop(); num.push(calc(x,y,tmpop)); } int calc(char *str) { init(); int x,y,i,n=strlen(str); char tmpop,last=0; for(i=0;i<n;i++) { if(isalpha(str[i])) num.push(str[i]); else if(isdigit(str[i])) { num.push(atoi(str+i)); for(;i+1<n&&isdigit(str[i+1]);++i); } else if(str[i]=='(') op.push('('); else if(str[i]==')') { while(op.top()!='(') calc(); op.pop(); } else if(str[i]=='-'&&(last==0||last=='(')) { num.push(0); op.push('-'); } else if(priv[str[i]]) { while(!op.empty()&&priv[op.top()]<=priv[str[i]]) calc(); op.push(str[i]); } else continue; last=str[i]; } while(!op.empty()) calc(); return num.top(); } char s[85],s2[85]; bool ok() { gets(s); gets(s2); return calc(s)==calc(s2); } int main() { int t; scanf("%d",&t); getchar(); while(t--) { if(ok()) printf("YES\n"); else printf("NO\n"); } return 0; }
没有听到程学长讲题,理解这个题还是有了一点困难【因为比较繁琐
几乎是比着程学长的代码敲的啊喂才明白这个题的。。。智商确实拙计。可爱的程学长的博客如下啦:
http://endless.logdown.com/posts/2014/05/15/poj-1686-lazy-math-instructor-in-java-scriptengine-usage
大体思路就是用两个栈存数和运算符,-号时存储数的栈push一个0。如果运算符的栈top是)则进行计算直到碰到(。
把a,b什么的都转化成ASCⅡ码【或者什么数的】然后比较两个表达式的计算值。