Problem Description
A math instructor is too lazy to grade a question in the exam papers in which students are supposed to produce a complicated formula for the question asked. Students may write correct answers in different forms which makes grading very hard. So, the instructor needs help from computer programmers and you can help.

You are to write a program to read different formulas and determine whether or not they are arithmetically equivalent.

 
Input
The first line of the input contains an integer N (1 <= N <= 20) that is the number of test cases. Following the first line, there are two lines for each test case. A test case consists of two arithmetic expressions, each on a separate line with at most 80 characters. There is no blank line in the input. An expression contains one or more of the following:

  • Single letter variables (case insensitive).
  • Single digit numbers.
  • Matched left and right parentheses.
  • Binary operators +, - and * which are used for addition, subtraction and multiplication respectively.
  • Arbitrary number of blank or tab characters between above tokens.

Note: Expressions are syntactically correct and evaluated from left to right with equal precedence (priority) for all operators. The coefficients and exponents of the variables are guaranteed to fit in 16-bit integers.

 
Output
Your program must produce one line for each test case. If input expressions for each test data are arithmetically equivalent, "YES", otherwise "NO" must be printed as the output of the program. Output should be all in upper-case characters.
 
Sample Input
3
(a+b-c)*2
(a+a)+(b*2)-(3*c)+c
a*2-(a+c)+((a+c+e)*2)
3*a+c+(2*e)
(a-b)*(a-b)
(a*a)-(2*a*b)-(b*b)

 
Sample Output
YES
YES
NO

这题的数据好水啊,没有带空隔的。下面有15组测式数据。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
typedef struct nn
{
int pri;//优先级,'(' > '*' > '+' = '-' > ')'
char cc;//运算符
}node;
int main()
{
int t,i,j,k,len,top1,top2;
char ch[2][100];
__int64 anss[1000],tem,ans[2],as[100],tt,n[2];//anss为数字栈,as中间数字栈,tem,ans[]为中间变量,n[]为最终的两个值进行比较
node C[1000];//符号栈
node c,c1;
scanf("%d",&t);
getchar();
while(t--)
{
gets(ch[0]); gets(ch[1]);//一定要注意输入
k=-1;
for(j=0;j<2;j++)
{
top1=top2=0;//分别指向数字栈和符号栈
len=strlen(ch[j]);
for(i=0;i<=len;i++)//注意等号
{
if(ch[j][i]==' ')//为空时,不往下运行
continue;
if(ch[j][i]>='0'&&ch[j][i]<='9'||ch[j][i]>='a'&&ch[j][i]<='z')
{
if(ch[j][i]>='0'&&ch[j][i]<='9')
as[++k]=ch[j][i]-'0';
else
as[++k]=ch[j][i]-'a'+97;//把a变成ASC码数
}
else
{
tt=1;tem=0;
for(;k>=0;k--)//变成一个整数
{
tem=tem+as[k]*tt; tt*=10;
}
if(tt!=1) anss[++top1]=tem;//当有数时存入数字栈printf("%I64d %d \n",tem,i);}
if(i==len) break;
if(ch[j][i]=='(') {c.pri=3;c.cc='(';}
if(ch[j][i]==')') {c.pri=0;c.cc=')';}
if(ch[j][i]=='+') {c.pri=1;c.cc='+';}
if(ch[j][i]=='-') {c.pri=1;c.cc='-';}
if(ch[j][i]=='*') {c.pri=2;c.cc='*';} if(top2!=0&&c.cc!='(')
{
c1=C[top2];
if(c1.cc=='('&&c.cc==')') //可以去掉空括号
{top2--;continue;} if(c1.pri<c.pri||c1.cc=='(') //当前符号的优先级大于栈顶或栈顶为右括号时,当前符号存入符号栈中
{C[++top2]=c;continue;}
while(top2>0&&c1.pri>=c.pri) //符号栈不为空并且当前的运算符的优先级小于等于栈顶
{
top2--; //退一个符号栈顶
ans[1]=anss[top1];top1--;
ans[0]=anss[top1];top1--; //printf("%I64d %c %I64d",ans[0],c1.cc,ans[1]);
if(c1.cc=='+') {ans[0]+=ans[1];anss[++top1]=ans[0];}
if(c1.cc=='-') {ans[0]-=ans[1];anss[++top1]=ans[0];}
if(c1.cc=='*') {ans[0]*=ans[1];anss[++top1]=ans[0];}
c1=C[top2]; //取出,为下一次运算printf("= %I64d\n",ans[0]);
if(c1.cc=='('||top2==0||c.pri>c1.pri) //在一直往前运算时,有三种情况要退出当前运算,
{ //1:一直运算到( ,2:栈为空,3:栈顶符优先级大于当前运算符优先级
if(c.cc==')') top2--;
else C[++top2]=c; //后两种情况时,要把当前的符号放入到符号栈中
break; //跳出循环
}
}
}
else//当符号栈为空或当前符号为( 时,直接放入符号栈中
{
C[++top2]=c;
}
}
}
while(top2>0)//运算还没有算完的运算符
{
c1=C[top2]; top2--;
ans[1]=anss[top1];top1--;
ans[0]=anss[top1];top1--;
if(c1.cc=='+') {ans[0]+=ans[1];anss[++top1]=ans[0];}
if(c1.cc=='-') {ans[0]-=ans[1];anss[++top1]=ans[0];}
if(c1.cc=='*') {ans[0]*=ans[1];anss[++top1]=ans[0];}
}
n[j]=anss[top1];//到这一步时,数字栈一定只有一个 数字(结果)
}
printf("%s\n",n[0]==n[1]?"YES":"NO");
}
}
/*
15
2 * 1-3+( 2 * 5 )
9
8
((2 * 4)-7*2+(5-(6 * 7)+ 4 ) )
(a)+(((b)))*(a-(2*b))*(1)*(b-2+c+a)*(d+e+a-f+b)
a * b * a * b * a * a * 9 * b * a * 8 * b * 7 * c * 9 * a
(((a)*a)*a * b * ( a-b)*( a - b )*(a-c)*(a+b))*(((b-c)))
b*a*(a*(a*(b-c))*((a+b)*(a-c))*(a-b)*(a-b))
(w-a)+(a-b)-(c+a)*4+d
(a-w)+(b-a)-(a+c)*d+4
a-b*c+a+d*a-c*a+e*a*b*9*z*8*w*7
(a*a*a*a*b*(c-b+1)+(a*b*(a*(a*d-c)+e)))*9*z*8*w*7
(a+b-c)*2
(a+a)+(b*2)-(3*c)+c
a*2-(a+c)+( (a+c+e)*2)
3*a+c+(2*e)
(a-b)*(a-b)
(a*a)-(2*a*b)-(b*b)
(a-b)*(a-b)
(a*a)-(2*a*b)+(b*b)
a*b
b*a
1+a-a
b+1-b
2+1+a+1
1+3+a
(1+a+b)+7 +c+(d)
a+c+b+d +1+1+(1+(2+3))
((((1)+a)+b))+6 +c+(d)
a+c+b+d +1+1+(1+(2+3))
*/


 

 

POJ 1686 Lazy Math Instructor (模似题+栈的运用) 各种坑的更多相关文章

  1. 数据结构——POJ 1686 Lazy Math Instructor 栈的应用

    Description A math instructor is too lazy to grade a question in the exam papers in which students a ...

  2. POJ 1686 Lazy Math Instructor(栈)

    原题目网址:http://poj.org/problem?id=1686 题目中文翻译: Description 数学教师懒得在考卷中给一个问题评分,因为这个问题中,学生会为所问的问题提出一个复杂的公 ...

  3. poj 1684 Lazy Math Instructor(字符串)

    题目链接:http://poj.org/problem?id=1686 思路分析:该问题为表达式求值问题,对于字母使用浮点数替换即可,因为输入中的数字只能是单个digit. 代码如下: #includ ...

  4. Lazy Math Instructor

      Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3721   Accepted: 1290 Description A m ...

  5. UVALive 2056 Lazy Math Instructor(递归处理嵌套括号)

    因为这个题目说明了优先级的规定,所以可以从左到右直接运算,在处理嵌套括号的时候,可以使用递归的方法,给定每一个括号的左右边界,伪代码如下: int Cal(){ if(括号)  sum += Cal( ...

  6. POJ - 2183 Bovine Math Geniuses

    “模拟“题,运用哈希,不断地按照一定运算规律对一个结果进行计算,如果重复出现就停止并且输出该数.注意到仔细看题,这种题一定要细心! POJ - 2183 Bovine Math Geniuses Ti ...

  7. POJ 1061 青蛙的约会 数论水题

    http://poj.org/problem?id=1061 傻逼题不多说 (x+km) - (y+kn) = dL 求k 令b = n-m ; a = x - y ; 化成模线性方程一般式 : Lx ...

  8. UVA.12096 The SetStack Computer ( 好题 栈 STL混合应用)

    UVA.12096 The SetStack Computer ( 好题 栈 STL混合应用) 题意分析 绝对的好题. 先说做完此题的收获: 1.对数据结构又有了宏观的上的认识; 2.熟悉了常用STL ...

  9. POJ 1845-Sumdiv(快速幂取模+整数唯一分解定理+约数和公式+同余模公式)

    Sumdiv Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Statu ...

随机推荐

  1. 总结Widows 7 Start->Run 命令

    Widows + R基本上成为很常用的方式,那么通过Windows + R我们可以在运行中做什么手脚呢. 下面从最基本的系统命令说起 notepad--------打开记事本    services. ...

  2. centos安装nodejs和mongodb

    安装nodejs: Run as root on RHEL, CentOS or Fedora, for Node.js v4 LTS Argon: curl --silent --location ...

  3. 15_RHEL7挂载NTFS分区

    1.下载ntfs-3g wget https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2015.3.14.tgz 2.安装 tar -zxvf ntfs-3 ...

  4. Day13 SQLAlchemy连表操作和堡垒机

    一.数据库操作 1.创建表.插入数据和一对多查询 #!/usr/bin/env python # -*- coding: utf-8 -*- # Author: wanghuafeng from sq ...

  5. 七天学会SALTSTACK自动化运维 (2)

    七天学会SALTSTACK自动化运维 (2) 导读 Grains Pillar 总结 参考链接 导读 上一篇主要介绍了安装和基本的使用方法,但是我认为如果理解了相关概念的话,使用会更加顺手,因为毕竟每 ...

  6. c#解析xml字符串 分析 EntityName 时出错

    因为xml字符串中的特殊html字符被转义了,怎么防止转义呢,可以在xml内加上<![CDATA[返回内容]] 这样可以防止特殊字符被转义,就好像微信公共平台消息传递也都是xml格式他们也都加& ...

  7. Markdown 测试

    量化派业务参考代码 测试二级标题 如果 merchant_id 是外部白条,则执行相关逻辑 if(order.getMerchantId() == Constants.BaitiaoMerchant. ...

  8. 关于MYSQL优化(持续更新)

    *利用MYSQL数据缓存提高效率,注意事项: 1.应用环境:不经常改变的表及对此表相同的查询 2.不适用于服务器端编写的语句 3.根据数据使用频率,合理分解表 4.合理使用默认条件,提高命中率 5.统 ...

  9. orcad中的PSpice仿真加入厂商模型

      <1>首先要知道原理图的符号是没有模型的,不是你肆意妄为就可以拉来仿真的. <2>其次要知道很多器件软件中是没有模型的. <3>有很多获取模型的方法:<使 ...

  10. 符合搜索引擎SEO规则的HTML代码

    实话说,部落在有时候,也经常会修改一下自己的主题,当然,很多时候,对自己修改过后的主题,会通过查看源代码的方式,来查看自己HTML代码,很多时候,也没有去刻意对代码进行符合搜索引擎SEO规则的优化,而 ...