POJ 1686 Lazy Math Instructor (模似题+栈的运用) 各种坑
You are to write a program to read different formulas and determine whether or not they are arithmetically equivalent.
- 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.
(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)
YES
NO
#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 (模似题+栈的运用) 各种坑的更多相关文章
- 数据结构——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(栈)
原题目网址:http://poj.org/problem?id=1686 题目中文翻译: Description 数学教师懒得在考卷中给一个问题评分,因为这个问题中,学生会为所问的问题提出一个复杂的公 ...
- 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 1061 青蛙的约会 数论水题
http://poj.org/problem?id=1061 傻逼题不多说 (x+km) - (y+kn) = dL 求k 令b = n-m ; a = x - y ; 化成模线性方程一般式 : Lx ...
- UVA.12096 The SetStack Computer ( 好题 栈 STL混合应用)
UVA.12096 The SetStack Computer ( 好题 栈 STL混合应用) 题意分析 绝对的好题. 先说做完此题的收获: 1.对数据结构又有了宏观的上的认识; 2.熟悉了常用STL ...
- POJ 1845-Sumdiv(快速幂取模+整数唯一分解定理+约数和公式+同余模公式)
Sumdiv Time Limit:1000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Submit Statu ...
随机推荐
- SGU 186.The Chain
看懂题就是水题... code #include <iostream> #include <algorithm> using namespace std; int a[110] ...
- 使用require.js时,解决AMD封装jquery1.4.1的问题。
require.config({ baseUrl: "js/", paths: { "jquery": "jquery-1.4.1.min" ...
- js中立即执行
( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到 ...
- 浅谈dataGridView使用,以及画面布局使用属性,对datagridview进行增删改查操作,以及委托使用技巧
通过几天的努力后,对datagridview使用作一些简要的介绍,该实例主要运用与通过对datagridview操作.对数据进行增删改查操作时,进行逻辑判断执行相关操作.简单的使用委托功能,实 ...
- dedecms织梦建站总结
说好要每月坚持写博客的,差一点就背弃自己的诺言了. 这一个月,除了修改magento站点和学习android外,一心都投在了为一家建筑公司做网站上去了,使用的是dedecms,我主要做的是前端开发,着 ...
- ecshop后台根据条件查询后不填充table 返回的json数据,content为空?
做ecshop后台开发的时,根据条件查询后,利用ajax返回的content json数据内容为空,没有填充table 效果 预期效果 问题: make_json_result($smarty -&g ...
- you need to be root to perform this command linux
获得root权限如何获得:打开终端,输入su回车 然后输入密码回车就行了
- Notepad++插件之FingerText
FingerText是一个标签触发片段插件记事本.支持多个热点同时编辑,嵌套的热点,动态热点(很多不仅仅是纯文本的,可以通过命令,或触发另一个片段中的片段),热点的文本提示(而不是仅仅是$或#号)和热 ...
- 转:jQuery常用插件
原文来自于:http://download.csdn.net/album/detail/369 jquery.cycle.all.js 上传者:itmyhome 上传时间:2014-06-1 ...
- 工作总结:检查字符串合法性(C++)
BOOL CLiftCtrlModbusConfigDlg::CheckValid(const CString &str) { ASSERT(str.GetLength() > ); ] ...