#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;
}
poj 1686 Lazy Math Instructor (字符串)
最新推荐文章于 2022-02-23 15:02:25 发布