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
  1. #include <cstring>
  2. #include <string>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <cmath>
  7. #include <vector>
  8. #include <cstdlib>
  9. #include <iostream>
  10. #include <stack>
  11. #include <map>
  12. #define max2(a,b) ((a) > (b) ? (a) : (b))
  13. #define min2(a,b) ((a) < (b) ? (a) : (b))
  14. using namespace std;
  15. map<char,int>m;
  16. string transform(string s)    //转化为后缀表达式
  17. {
  18. int len=s.length();
  19. char c[100];
  20. int top=0;
  21. stack<char>exp;
  22. for(int i=0;i<len;i++)
  23. {
  24. if(isalnum(s[i])) c[top++]=s[i];
  25. else
  26. {
  27. switch(s[i])
  28. {
  29. case '(':
  30. exp.push(s[i]);
  31. break;
  32. case ')':
  33. while(exp.top()!='(')
  34. {
  35. c[top++]=exp.top();
  36. exp.pop();
  37. }
  38. exp.pop();
  39. break;
  40. case '+':
  41. case '-':
  42. case '*':
  43. while(!exp.empty()&&m[s[i]]<=m[exp.top()])
  44. {
  45. c[top++]=exp.top();
  46. exp.pop();
  47. }
  48. exp.push(s[i]);
  49. }
  50. }
  51. }
  52. while(!exp.empty())
  53. {
  54. c[top++]=exp.top();
  55. exp.pop();
  56. }
  57. c[top]='\0';
  58. string temp=c;
  59. return temp;
  60. }
  61. int cal(string s)
  62. {
  63. int len=s.length();
  64. stack<int>c;
  65. for(int i=0;i<len;i++)
  66. {
  67. if(isalnum(s[i]))
  68. {
  69. if(isdigit(s[i]))
  70. c.push(s[i]-'0');
  71. else
  72. c.push(s[i]);
  73. }
  74. else
  75. {
  76. int a=c.top();
  77. c.pop();
  78. int b=c.top();
  79. c.pop();
  80. switch(s[i])
  81. {
  82. case '+':c.push(b+a);
  83. break;
  84. case '-':c.push(b-a);
  85. break;
  86. case '*':c.push(b*a);
  87. }
  88. }
  89. }
  90. return c.top();
  91. }
  92. int main()
  93. {
  94. int t;
  95. string s1,s2;
  96. m['(']=0;
  97. m['+']=m['-']=1;
  98. m['*']=2;
  99. cin>>t;
  100. getchar();
  101. while(t--)
  102. {
  103. getline(cin,s1);
  104. getline(cin,s2);
  105. string t1=transform(s1);
  106. string t2=transform(s2);
  107. int ans1=cal(t1);
  108. int ans2=cal(t2);
  109. if(ans1==ans2)
  110. cout<<"YES"<<endl;
  111. else
  112. cout<<"NO"<<endl;
  113. }
  114. return 0;
  115. }

Problem K 栈的更多相关文章

  1. Codeforces Gym 100610 Problem K. Kitchen Robot 状压DP

    Problem K. Kitchen Robot Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10061 ...

  2. Codeforces 1089K - King Kog's Reception - [线段树][2018-2019 ICPC, NEERC, Northern Eurasia Finals Problem K]

    题目链接:https://codeforces.com/contest/1089/problem/K time limit per test: 2 seconds memory limit per t ...

  3. Gym 101981K - Kangaroo Puzzle - [玄学][2018-2019 ACM-ICPC Asia Nanjing Regional Contest Problem K]

    题目链接:http://codeforces.com/gym/101981/problem/K Your friend has made a computer video game called “K ...

  4. Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem K. UTF-8 Decoder 模拟题

    Problem K. UTF-8 Decoder 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c702 ...

  5. 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem K. KMC Attacks 交互题 暴力

    Problem K. KMC Attacks 题目连接: http://codeforces.com/gym/100714 Description Warrant VI is a remote pla ...

  6. XVII Open Cup named after E.V. Pankratiev Grand Prix of Moscow Workshops, Sunday, April 23, 2017 Problem K. Piecemaking

    题目:Problem K. PiecemakingInput file: standard inputOutput file: standard outputTime limit: 1 secondM ...

  7. 2018 Multi-University Training Contest 4 Problem K. Expression in Memories 【模拟】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6342 Problem K. Expression in Memories Time Limit: 200 ...

  8. HDU 6342.Problem K. Expression in Memories-模拟-巴科斯范式填充 (2018 Multi-University Training Contest 4 1011)

    6342.Problem K. Expression in Memories 这个题就是把?变成其他的使得多项式成立并且没有前导零 官方题解: 没意思,好想咸鱼,直接贴一篇别人的博客,写的很好,比我的 ...

  9. 华农oj Problem K: 负2进制【有技巧构造/待补】

    Problem K: 负2进制 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 51 Solved: 6 [Submit][Status][Web Boa ...

随机推荐

  1. 转!!java中关键字volatile的作用

    用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...

  2. mysql设置编码

    1.修改数据库的编码   将数据库(test)的编码方式修改为utf8,如:   ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE ut ...

  3. angular 模板 小例子

    参考网站:https://docs.angularjs.org/tutorial/step_09 先看下目录结构 新建个空文件夹, 输入命令: express --view ejs cnpm inst ...

  4. before和after的强大

    前言:刚学他两个的时候,是用于清除浮动,而且曾单纯的以为俩只有这作用. 但看到几篇博客后,发现自己是多么的无知,他两个的强大远不止于此. 当然,这篇文章大多数是借鉴网上的实例,在加上自己的些许简介而成 ...

  5. 带不带protype的区别

    总结写在前面: ①:带有protype:表示类的扩展,必须new后才能使用. ②:不带protype:属于静态方法,直接调用即可. html代码: <!DOCTYPE html> < ...

  6. js一些题目

    假期在家,看到的,昨天看了下: 原文链接:http://wwwcqamin.duapp.com/?p=102#comment-7 请说出下面程序的输出结果 第一题: 1 2 3 4 5 6 7 8 9 ...

  7. JAVA中线程同步的方法(7种)汇总

    同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就 ...

  8. 在Windows8.1中通过IIS发布网站产生HTTP Error 503错误的解决方案

    1.解决IIS下网站Bin目录中32位DLL不能使用,如图所示 2.解决通过IIS浏览网站,出现Http503的问题,如图所示

  9. Tomcat Manager用户配置详解

      Tomcat Manager是Tomcat自带的.用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用.Tomcat是Java领域使用最广泛的服务器之一,因此Tomcat Ma ...

  10. 笔记9:winfrom的一些知识点(二)

    一.新建,和删除文件夹 private void button4_Click(object sender, EventArgs e) { Directory.Delete(@"F:\&quo ...