原题目网址:http://poj.org/problem?id=1686

题目中文翻译:

Description

数学教师懒得在考卷中给一个问题评分,因为这个问题中,学生会为所问的问题提出一个复杂的公式,但是学生可以用不同的形式写出正确的答案,这使得评分非常困难。 所以,教师需要计算机程序员的帮助,或许你可以提供帮助。

你应该编写一个程序来阅读不同的公式,并确定它们是否在算术上相同。

 

Input

输入的第一行包含一个整数N(1 <= N <= 20),即测试用例的数量。 在第一行之后,每个测试用例都有两行。 一个测试用例由两个算术表达式组成,每个算术表达式在一个单独的行上,最多80个字符。 输入中没有空白行。 表达式包含以下一项或多项:

单字母变量(不区分大小写)。

单个数字。

相匹配的左括号和右括号。

二元运算符+, - 和*分别用于加,减和乘。

上述符号之间的任意数量的空白或制表符。

注意:表达式在语法上是正确的,并且从左到右以所有运算符的优先级相同(优先级)进行计算。 变量的系数和指数保证适合16位整数。

Output

您的程序必须为每个测试用例输出一行。如果每个测试数据的输入表达式在算术上相同,则必须打印“YES”,否则必须打印“NO”为程序输出。输出应全部使用大写字母。

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

解题思路:

本题要求两个表达式是否相等,而C++无法将数字与字母一起运算,那么我们很容易想到用一个数字代替字母.只要想到这一点,那么这个题的思路就明了了.先逆波兰一遍,再运算就可以了.

AC代码:

 #include<cstdio>
#include<map>
#include<cctype>
#include<iostream>
#include<stack>
#include<string> using namespace std; map<char ,int> m;
string s1,s2,r1,r2; string nibolan(string l) {//逆波兰过程
int len = l.length(),i,j;
char c[];
stack<char > p;
for(i = j = ;i <= len; i++) {
if(isalnum(l[i])) c[j++] = l[i];
else {
switch(l[i]) {
case '(':
p.push(l[i]);
break;
case ')':
while(p.top() != '(') {
c[j++] = p.top();
p.pop();
}
p.pop();
break;
case '+':
case '-':
case '*':
while(!p.empty() && m[l[i]] <= m[p.top()]) {
c[j++] = p.top();
p.pop();
}
p.push(l[i]);
}
}
}
while(!p.empty()) {
c[j++] = p.top();
p.pop();
}
c[j] = '\0';
string ans = c;
return ans;
} int result(string l) {//运算过程
int len = l.length(),a,b;
stack<int > ll;
for(int i = ;i < len ;i++) {
if(isalnum(l[i])) {
if(isdigit(l[i])) ll.push(l[i] - '');
else ll.push(l[i]);
}
else {
a = ll.top();
ll.pop();
b = ll.top();
ll.pop();
switch(l[i]) {
case '+':
ll.push(b+a);
break;
case '-':
ll.push(b-a);
break;
case '*':
ll.push(b*a);
}
}
}
return ll.top();
} int main()
{
int a;
m['('] = ;
m['+'] = m['-'] = ;
m['*'] = ;//为了比较运算优先级
cin >> a;
cin.get();//跳过一个回车
while(a--) {
getline(cin,s1);
getline(cin,s2);
r1 = nibolan(s1);
r2 = nibolan(s2);
if(result(r1) == result(r2)) printf("YES\n");
else printf("NO\n");
}
return ;
}

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 (模似题+栈的运用) 各种坑

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

  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 2389 Bull Math(水~Java -大数相乘)

    题目链接:http://poj.org/problem?id=2389 题目大意: 大数相乘. 解题思路: java BigInteger类解决 o.0 AC Code: import java.ma ...

  8. POJ 3159 Candies(SPFA+栈)差分约束

    题目链接:http://poj.org/problem?id=3159 题意:给出m给 x 与y的关系.当中y的糖数不能比x的多c个.即y-x <= c  最后求fly[n]最多能比so[1] ...

  9. poj 2796 Feel Good单调栈

    Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20408   Accepted: 5632 Case T ...

随机推荐

  1. xml解析工具mashaller javaee自带解析类

    1.怎样去掉Marshaller的格式化? : JAXBContext context = JAXBContext.newInstance(Entity.class); Marshaller mars ...

  2. 【c++】面向对象程序设计之继承中的类作用域

    当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内. 一个对象.引用或指针的静态类型决定了该对象的哪些成员是可见的.即使静态类型与动态类型可能不一致,但我们使用哪些成员仍然是由静态类型决定的.基 ...

  3. Linux性能诊断工具

    vmstat:虚拟内存状况 –swpd   free  buff  cache   si  so   in   cs 參考:http://www.cnblogs.com/ggjucheng/archi ...

  4. poj1904 二分图匹配+强连通分量

    http://poj.org/problem?id=1904 Description Once upon a time there lived a king and he had N sons. An ...

  5. robotframework接口自动化

    robot framework框架在测试接口上比soapUI好用的多,在此介绍下get方法的HTTP接口,其实这个接口也是把POST数据作为参数进行get请求,使用post 方法也是一样,一共6步就可 ...

  6. AngularJS自己定义标签加入回调函数eval()

    function helloworld(name){ console.log("hello!!!!!"+name) } var name="zhangsan"; ...

  7. [IT学习]跟阿铭学linux(第3版)

    1.安装Linux在虚拟化平台上 Windows Vmware Workstation,需要在本机上打开CPU对虚拟化的支持.Virtualization Cent OS7 已成功安装. 2.http ...

  8. Trie(前缀树)和ternary trie和binary search tree

    1 什么是trie trie是一棵多叉树,假如存放的是由26个字母(不区分大小写)构成的字符串的话,那么就是一棵26叉树. trie树是一棵前缀树,因为每个结点只保存字符串中的一个字符,整个字符串保存 ...

  9. 65*24=1560<2175 对数据的统计支撑决策假设 历史数据正确的情况下,去安排今后的任务

    没有达到目标,原因不是时间投入不够,而是不用数据决策,不用数据调度定时脚本 [数据源情况统计]----># 近30天,日生效coin数目SELECT COUNT(DISTINCT coin) A ...

  10. Lightoj 1014 - Ifter Party

    I have an Ifter party at the 5th day of Ramadan for the contestants. For this reason I have invited  ...