原题目网址: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. 2017多校Round2(hdu6045~hdu6055)

    补题进度:10/11 1001(不等式) 根据题意列不等式,解一解就行了 1002(套路) 题意: 给定一个随机产生的1e6*1e6的矩阵和一个1e3*1e3的矩阵,你要回答这个1e3*1e3的小矩阵 ...

  2. java 数组 输入5名学生的成绩 得出平均分。

    import java.util.Scanner; public class LianXi4{ public static void main(String[] args){ //创建长度为5的数组 ...

  3. mysql登录退出命令

    1. MySQL登录与退出登录Mysql:“输入mysql -u帐号 -p密码 这是登陆mysql退出:mysql > exit;以下是实例参考下: 登录Mysql:“输入mysql -uroo ...

  4. POJ3255 Roadblocks 【次短路】

    Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7760   Accepted: 2848 Descri ...

  5. 一处折腾笔记:Android内嵌html5加入原生微信分享的解决的方法

    有一段时间没有瞎折腾了. 这周一刚上班萌主过来反映说:微信里面打开聚客宝.分享功能是能够的(这里是用微信自身的js-sdk实现的).可是在android应用里面打开点击就没反应了:接下来狡猾的丁丁在产 ...

  6. mysql数据库优化之表的设计和慢查询定位

    一.数据库优化包含的方面 数据库优化是一种综合性的技术.并非通过某一种方式让数据库效率提高非常多.而是通过多方面的提高.从而使得数据库性能提高. 主要包含: 1.表的设计合理化(3范式) 2.给表加入 ...

  7. SQLite Expert表分离和解决SQLite Expert删除表后大小不变的问题

    最后要使用到号码归属地的查询,在网上找到一个数据库文件.大小有12M多,压缩成zip也有1.9M,这样对于一个apk的大小非常不利,后来看了一下数据库的内容,发现有非常多冗余.特别是中文字符占用非常大 ...

  8. powerdesign导出SQL时自己主动生成凝视

    1.使用脚本的方式 在里面执行 Option Explicit ValidationMode   = True InteractiveMode   =   im_Batch Dim   mdl   ' ...

  9. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  10. centos+nginx+php-fpm+php include fastcgi_params php页面能訪问但空白,被fastcgi_params与fastcgi.conf害慘了

    今天在centos上折腾这块是发现老是訪问页面时,浏览器中提示是200 ok.且訪问html后缀却是正常出现内容. 可是訪问php后缀却返回空白页面,同一时候查看全部的log没有发现不论什么出错信息; ...