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. js 表达式与运算符 详解(下)

    比较运算符: > .>= .<. <=.  ==. !=. ===. !==. 比较运算符的结果都为布尔值 ==只比较值是否相等    而    ===比较的是值和数据类型都要 ...

  2. 谈谈 jQuery 中的防冲突(noConflict)机制

    许多的 JS 框架类库都选择使用 $ 符号作为函数或变量名,jQuery 是其中最为典型的一个.在 jQuery 中,$ 符号只是 window.jQuery 对象的一个引用,因此即使 $ 被删除,w ...

  3. dedecms修改templets为别的名字

    修改templets模板文件夹的方法: 首先找到系统配置文件common.inc.php,此文件存放在Include目录下,打开common.inc.php来修改默认模板目录templets, 查找: ...

  4. 移动端版本兼容js

    移动端版本兼容js <!--移动端版本兼容 --> <script type="text/javascript"> var phoneWidth = par ...

  5. dedecms 文章排列方式

    orderby='sortrank' 文档排序方式orderby='hot' 或 orderby='click' 表示按点击数排列orderby='sortrank' 或 orderby='pubda ...

  6. 关于本地计算机无法启动Apache2

    最近因工作需要,要学习PHP的基础编程,于是学习架设PHP工作环境. 但按照教材上介绍的那样,安装了WMAP后,一直无法运行成功.后发现Apache一直都不在运行状态.到WMAP中的Apache选项中 ...

  7. C语言学习笔记(二):指针的用法

    与其说指针是一种工具,不如先说指针是一种数据类型. -------------------------------------------------------------华丽的分割线------- ...

  8. 最好用的手机编程软件-C4droid

    Q:c4droid是什么? A:c4droid(以下简称c4)是安卓平台上最强大的c/c++ 编译器,你可以在手机上用手机编写自己的C/C++程序,并且可以把程序导出成apk文件. 下载地址:http ...

  9. [BZOJ 1066] [SCOI2007] 蜥蜴 【最大流】

    题目链接:BZOJ - 1066 题目分析 题目限制了高度为 x 的石柱最多可以有 x 只蜥蜴从上面跳起,那么就可以用网络流中的边的容量来限制.我们把每个石柱看作一个点,每个点拆成 i1, i2,从 ...

  10. ASP.NET Routing

    ASP.NET Routing Other Versions   ASP.NET routing enables you to use URLs that do not have to map to ...