等价表达式-OJ

来源:互联网 发布:王尼玛 知乎 五五开 编辑:程序博客网 时间:2024/06/07 08:07

                          等价表达式

描述

判断两个表达式在数学上是否是等价的。
输入
第一行:N(1<=N<=20),表示测试数据组数。
接下来每组测试数据包括两行,每行包括一个数学表达式,每个表达式的长度不超过80个字符。输入数据没有空行。

一个表达式可能包括:
单个英文字母表示的变量(区分大小写)
数字(只有一位数)
配对的括号
运算符加+、减-、乘*
任意数量的空格或tab(可能出现在表达式中间的任何位置)

注意:表达式保证是语法正确的,且所有运算符的优先级相同,运算次序从左至右。变量的系数和指数保证不超过16位整数。
输出
对每个测试数据,输出一行:等价则输出“YES”,不等价则输出“NO”。
样例输入
3(a+b-c)*2(a+a)+(b*2)-(3*c)+ca*2-(a+c)+((a+c+e)*2)3*a+c+(2*e)(a-b)*(a-b)(a*a)-(2*a*b)-(b*b)
样例输出
YESYESNO
个人理解:
1:真的是刚学数据结构,还有C++之前没有学过,现在开始慢慢学了一些关于这些方面的知识,所以这份代码我只看懂了一点点,具体要懂的话估计要等我学更多的数据结构的知识才能懂。
代码:
  1. #include <cstdio>  
  2. #include <iostream>  
  3. #include <string>  
  4. #include <cstring>  
  5. #include <stack>  
  6. using namespace std;  
  7. #define MAX 100  
  8. string change(char *p) {  
  9.     string cnt;  
  10.     int len=strlen(p);  
  11.     stack<char>astack;  
  12.     for(int i=0; i<=len; i++) {  
  13.         if((p[i]>='0' && p[i]<='9') || (p[i]>='a' && p[i]<='z'))  
  14.             cnt+=p[i];  
  15.         else if(p[i]=='(')  
  16.             astack.push('(');  
  17.         else if(p[i]==')') {  
  18.             while(astack.top()!='(') {  
  19.                 cnt+=astack.top();  
  20.                 astack.pop();  
  21.             }  
  22.             astack.pop();  
  23.         }  
  24.         else if(p[i]=='+' || p[i]=='-') {  
  25.             while(!astack.empty() && astack.top()!='(') {  
  26.                 cnt+=astack.top();  
  27.                 astack.pop();  
  28.             }  
  29.             astack.push(p[i]);  
  30.         }  
  31.         else if(p[i]=='*') {  
  32.             while(!astack.empty() && astack.top()!='(' && astack.top()=='*') {  
  33.                 cnt+=astack.top();  
  34.                 astack.pop();  
  35.             }  
  36.             astack.push(p[i]);  
  37.         }  
  38.         else if(p[i]==' ' || p[i]=='    ')  
  39.             continue;  
  40.     }  
  41.     while(!astack.empty()) {  
  42.         cnt+=astack.top();  
  43.         astack.pop();  
  44.     }  
  45.     return cnt;  
  46. }  
  47. int getsum(string num) {  
  48.     int len=num.length();  
  49.     stack<int>astack;  
  50.     for(int i=0; i<len; i++) {  
  51.         if(num[i]<='z' && num[i]>='a') {  
  52.             int ascii=num[i];  
  53.             astack.push(ascii);  
  54.         }  
  55.         else if(num[i]>='0' && num[i]<='9')  
  56.             astack.push((int)num[i]-'0');  
  57.         else if(num[i]=='+') {  
  58.             int n=astack.top();  
  59.             astack.pop();  
  60.             int m=astack.top();  
  61.             astack.pop();  
  62.             m+=n;  
  63.             astack.push(m);  
  64.         }  
  65.         else if(num[i]=='*') {  
  66.             int n=astack.top();  
  67.             astack.pop();  
  68.             int m=astack.top();  
  69.             astack.pop();  
  70.             n*=m;  
  71.             astack.push(n);  
  72.         }  
  73.         else if(num[i]=='-') {  
  74.             int n=astack.top();  
  75.             astack.pop();  
  76.             int m=astack.top();  
  77.             astack.pop();  
  78.             m-=n;  
  79.             astack.push(m);  
  80.         }  
  81.     }  
  82.     int result=astack.top();  
  83.     astack.pop();  
  84.     return result;  
  85. }  
  86. int main() {  
  87.     int N;  
  88.     scanf("%d", &N);  
  89.     cin.get();  
  90.     while(N--) {  
  91.         char s1[MAX], s2[MAX];  
  92.         cin.getline(s1, MAX);  
  93.         string p1=change(s1);  
  94.         int a=getsum(p1);  
  95.         cin.getline(s2, MAX);  
  96.         string p2=change(s2);  
  97.         int b=getsum(p2);  
  98.         if(a==b)  
  99.             cout << "YES" << endl;  
  100.         else  
  101.             cout << "NO" << endl;  
  102.     }  
  103.     return 0;  
  104. }  
原创粉丝点击