poj 1686 Lazy Math Instructor (字符串)

来源:互联网 发布:tomcat mac 安装 编辑:程序博客网 时间:2024/04/30 01:42
#include<map>#include<stack>#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std;map<char,int> m;int n;char s1[100],s2[100];bool is(char c)//判断是运算符还是操作数{if(c>='a'&&c<='z'||c>='A'&&c<='Z'||c<='9'&&c>='1')return true;return false;}string change(char s[])//读入表达式{int len=strlen(s);string temp;char c[200];stack<char> cs;//表达式栈int i,j;for(i=0,j=0;i<len;i++){if(is(s[i]))c[j++]=s[i];else{switch(s[i]){case '(':cs.push(s[i]);//遇到左括号就压入栈中break;case ')':while(cs.top()!='(')//栈顶不为左括号时{c[j++]=cs.top();//出现右括号必有左括号所以这里是处理一对括号内的运算cs.pop();//将栈顶元素弹出栈}cs.pop();//将左括号弹出栈break;case '+':case '-':case '*':while(!cs.empty() && m[s[i]]<=m[cs.top()])//判断栈顶元素跟当前元素的优先级{c[j++]=cs.top();//栈顶元素优先级较高时先处理cs.pop();}cs.push(s[i]);//将当前元素入栈break;}}}if(!cs.empty())//处理最后的运算符,最后为根,所以在上面的循环只压入栈不处理{c[j++]=cs.top();cs.pop();}c[j]='\0';temp=c;//直接将char数组赋给string类型,得到波兰表达式return temp;}int calcu(string ss)//(波兰表达式求值){int len=ss.size();stack<int> r;//求值栈for(int i=0;i<len;i++)if(is(ss[i]))//将操作数转换为数字{if(ss[i]>='1' && ss[i]<='9')r.push(ss[i]-'0');else   r.push((int)ss[i]);}else{int a,b,c;//读入的为运算符,取栈顶的两个元素进行运算,结果保存在c中并重新压入栈a=r.top();r.pop();b=r.top();r.pop();switch(ss[i]){case'+':c=a+b;r.push(c);break;case'-':c=b-a;//因为后面的元素后入栈所以后入先出,除法跟减法时要注意r.push(c);break;case'*':c=a*b;r.push(c);break;}}return r.top();}int main(){m['+']=1;m['-']=1;m['*']=2;m['(']=0;//表明优先级scanf("%d",&n);getchar();for(int i=0;i<n;i++){gets(s1);gets(s2);string t1,t2;t1=change(s1);t2=change(s2);int re1=calcu(t1);int re2=calcu(t2);if(re1==re2)printf("YES\n");else printf("NO\n");}system("pause");return 0;}