• codevs 1107 等价表达式


    传送门

    题解:第一眼这题好像非常难得样子,简直没有思路。但是这可以用栈带入特殊值来解决。这里用到两个栈,一个是存贮数字,另一个存贮运算符,按优先级进行运算。当读入的运算符比运算符栈的栈顶元素优先级低时,弹出栈顶元素,然后继续判断,直到小于栈顶元素,然后将这个运算符压入栈中。若读到右括号时,则将括号里的所有运算符依次弹出进行运算,直到读到左括号。然后最后只需判断两个表达式的结果是否相同,注意多带入几个特殊值,防止出现偶然性结果。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    string str1,str2;
    int n,k,m=0;
    long long num[50],ys[50];//num[]数字栈,ys[]运算符栈 
    long long power(long long a,long long b)//由于cmath里的power(x,y)x、y为实型,所以自定义一个,计算a的b次方 
    {
        long long ans=1;
        for (int i=1;i<=b;i++)
          ans=ans*a;
        return ans;
    }
    void js(int p,int q)
    {
        if (q==1) num[p-1]=num[p-1]+num[p];
        if (q==2) num[p-1]=num[p-1]-num[p];
        if (q==3) num[p-1]=num[p-1]*num[p];
        if (q==4) num[p-1]=power(num[p-1],num[p]);    
    }
    long long xx(string str)
    {
       int sn,len=str.length(),p=-1,q=-1;
       long long nn=0;
       for (int i=0;i<len;i++)
        {
            if (str[i]=='a') num[++p]=k;//将a带入特殊值 
            else if (str[i]>='0'&&str[i]<='9')
              nn=nn*10+(str[i]-'0');
            else if (str[i]!=' ')
              {
                  if (nn!=0) 
                  {
                      num[++p]=nn;
                      nn=0;
                  }
                 if (str[i]=='+') sn=1;//枚举运算符,并各用一数字表示 
                 if (str[i]=='-') sn=2;
                 if (str[i]=='*') sn=3;
                 if (str[i]=='^') sn=4;
                 if (str[i]=='(') sn=5;
                 if (str[i]==')') sn=6;
                 if (sn==5) ys[++q]=sn;//读入到左括号 
                 else if (sn==6)//读入右括号,将括号内先进行运算。 
                   while (q>=0&&ys[q--]!=5) js(p--,ys[q+1]);
                 else 
                   {
                         while (q>=0&&ys[q]<=4&&ys[q]>=sn) js(p--,ys[q--]);
                         ys[++q]=sn;
                   }           
              }
        }
        if (nn!=0)//清空栈 
          {
               num[++p]=nn;
               nn=0;
          }
        while (q>=0) js(p--,ys[q--]);
        return num[0];
    }
    int main()
    {
        getline(cin,str1);
        cin>>n;
        getline(cin,str2); //避免换行符的影响,这个读入的是空字符串 
        while (n--)
          {
               bool f=true;
               getline(cin,str2);
               for (int i=17;i<=27;i++)//枚举几个例子,将其带入a,计算两个表达式结果是否相同 
                 {
                       k=i;
                       if (xx(str1)!=xx(str2)) //判断两个表达式结果是否相同 
                    {
                       f=false;
                       break;
                    }
                 }
                 
              if (f) cout<<(char)('A'+m);
              m++;     
          }
        cout<<endl;
        return 0;
    } 
    参考黄学长博客
    I'm so lost but not afraid ,I've been broken and raise again
  • 相关阅读:
    开源框架/软件汇总
    如何查看Maven项目的jar包依赖
    我的前端技术栈(2018版)
    解决在Mac上用pyenv安装python3失败的问题
    学习jenv
    学习sbtenv
    解决MAC下修改系统文件没权限的问题
    学习Spring Boot
    学习音标
    C# 对List中的Object进行排序
  • 原文地址:https://www.cnblogs.com/sjymj/p/5704650.html
Copyright © 2020-2023  润新知