POJ 1686 Lazy Math Instructor(栈)
原题目网址: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(栈)的更多相关文章
- 数据结构——POJ 1686 Lazy Math Instructor 栈的应用
Description A math instructor is too lazy to grade a question in the exam papers in which students a ...
- POJ 1686 Lazy Math Instructor (模似题+栈的运用) 各种坑
Problem Description A math instructor is too lazy to grade a question in the exam papers in which st ...
- poj 1684 Lazy Math Instructor(字符串)
题目链接:http://poj.org/problem?id=1686 思路分析:该问题为表达式求值问题,对于字母使用浮点数替换即可,因为输入中的数字只能是单个digit. 代码如下: #includ ...
- Lazy Math Instructor
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3721 Accepted: 1290 Description A m ...
- UVALive 2056 Lazy Math Instructor(递归处理嵌套括号)
因为这个题目说明了优先级的规定,所以可以从左到右直接运算,在处理嵌套括号的时候,可以使用递归的方法,给定每一个括号的左右边界,伪代码如下: int Cal(){ if(括号) sum += Cal( ...
- POJ - 2183 Bovine Math Geniuses
“模拟“题,运用哈希,不断地按照一定运算规律对一个结果进行计算,如果重复出现就停止并且输出该数.注意到仔细看题,这种题一定要细心! POJ - 2183 Bovine Math Geniuses Ti ...
- POJ 2389 Bull Math(水~Java -大数相乘)
题目链接:http://poj.org/problem?id=2389 题目大意: 大数相乘. 解题思路: java BigInteger类解决 o.0 AC Code: import java.ma ...
- POJ 3159 Candies(SPFA+栈)差分约束
题目链接:http://poj.org/problem?id=3159 题意:给出m给 x 与y的关系.当中y的糖数不能比x的多c个.即y-x <= c 最后求fly[n]最多能比so[1] ...
- poj 2796 Feel Good单调栈
Feel Good Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20408 Accepted: 5632 Case T ...
随机推荐
- xml解析工具mashaller javaee自带解析类
1.怎样去掉Marshaller的格式化? : JAXBContext context = JAXBContext.newInstance(Entity.class); Marshaller mars ...
- 【c++】面向对象程序设计之继承中的类作用域
当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内. 一个对象.引用或指针的静态类型决定了该对象的哪些成员是可见的.即使静态类型与动态类型可能不一致,但我们使用哪些成员仍然是由静态类型决定的.基 ...
- Linux性能诊断工具
vmstat:虚拟内存状况 –swpd free buff cache si so in cs 參考:http://www.cnblogs.com/ggjucheng/archi ...
- poj1904 二分图匹配+强连通分量
http://poj.org/problem?id=1904 Description Once upon a time there lived a king and he had N sons. An ...
- robotframework接口自动化
robot framework框架在测试接口上比soapUI好用的多,在此介绍下get方法的HTTP接口,其实这个接口也是把POST数据作为参数进行get请求,使用post 方法也是一样,一共6步就可 ...
- AngularJS自己定义标签加入回调函数eval()
function helloworld(name){ console.log("hello!!!!!"+name) } var name="zhangsan"; ...
- [IT学习]跟阿铭学linux(第3版)
1.安装Linux在虚拟化平台上 Windows Vmware Workstation,需要在本机上打开CPU对虚拟化的支持.Virtualization Cent OS7 已成功安装. 2.http ...
- Trie(前缀树)和ternary trie和binary search tree
1 什么是trie trie是一棵多叉树,假如存放的是由26个字母(不区分大小写)构成的字符串的话,那么就是一棵26叉树. trie树是一棵前缀树,因为每个结点只保存字符串中的一个字符,整个字符串保存 ...
- 65*24=1560<2175 对数据的统计支撑决策假设 历史数据正确的情况下,去安排今后的任务
没有达到目标,原因不是时间投入不够,而是不用数据决策,不用数据调度定时脚本 [数据源情况统计]----># 近30天,日生效coin数目SELECT COUNT(DISTINCT coin) A ...
- Lightoj 1014 - Ifter Party
I have an Ifter party at the 5th day of Ramadan for the contestants. For this reason I have invited ...