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. cocos2dx解析lua table数据结构 简易版.

    之前一直用xml填配置, cocos2dx自带了xml解析接口, 非常方便. 但是, 接口好用也改变不了xml的结构字符太多, 书写麻烦, 乱七八糟的事实. 很早就想换lua, 无奈引擎没有现成接口, ...

  2. js事件练习--登录界面演示。

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. jquery中eq和get的区别与使用方法

    $("p").eq(0).css("color") //因为eq(num)返回的是个jq对象,所以可以用jq的方法css使用get来获得第一个p标签的color ...

  4. 9张思维导图学习Javascript

    分别归类为: javascript变量 javascript运算符 javascript数组 javascript流程语句 javascript字符串函数 javascript函数基础 javascr ...

  5. Linux学习2

    第三讲Linux常用命令04 压缩:gzip: 1.只能压缩文件,不能压缩目录 2.不保留源文件 解压缩:gunzip   gzip -d ------------------------------ ...

  6. core dump

    Core Dump?! 整理:Wilbur Lang 何谓 core? 在使用半导体作为内存的材料前,人类是利用线圈当作内存的材料(发明 者为王安),线圈就叫作 core ,用线圈做的内存就叫作 co ...

  7. Flux工作流

    Flux工作流 模型层(M)和控制层(C) Flux 只是这个模式的一个例子. 很多代码和一堆重复的模板 在其他JavaScript环境中实现重用. 强大又容易配置的模块化打包工具Webpack来简化 ...

  8. Nearest Common Ancestors

    poj1330:http://poj.org/problem?id=1330 题意:求一棵树上的两点的最近的公共祖先. 题解:第一次接触LCA,第一道模板题. #include <iostrea ...

  9. iso 开发学习--简易音乐播放器(基于iPhone4s屏幕尺寸)

    三个按钮  一个进度条 贴图(软件中部分图片,来自网络,如果侵犯了您的权益,请联系我,会立刻撤下) 核心代码 // // ViewController.m // 08-10-MusicPlayer / ...

  10. php pack、unpack、ord 函数使用方法

    string pack ( string $format [, mixed $args [, mixed $... ]] ) Pack given arguments into a binary st ...