1 条题解

  • 0
    @ 2021-6-15 14:43:57

    C++ :

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    long long ans;
    int  number[100],i,pd,len,x,tot,j,l,n,yx[60];
    char symbol[100],s[100];
    void init()//预处理每种运算符的优先级
    {
           int m;
           m='^';
           yx[m-40]=3;
           m='*';
           yx[m-40]=2;
           m='/';
           yx[m-40]=2;
           m='+';
           yx[m-40]=1;
           m='-';
           yx[m-40]=1;
           m='(';//左括号最小,因为左括号后面的运算符需要直接入栈
           yx[m]=0;
    }
    int mys()//幂运算
    {
           int m,ans=1;
           for(m=1;m<=number[n];m++)
             ans*=number[n-1];
           return ans;
    }
    void khcl()//将栈顶的两个元素弹出计算后重新压入栈中
    {
           switch(symbol[tot])
            {
                 case'+':number[n-1]+=number[n];break;
                 case'-':number[n-1]-=number[n];break;
                 case'*':number[n-1]*=number[n];break;
                 case'/':number[n-1]/=number[n];break;
                 case'^':number[n-1]=mys();break;
            }
            tot--;
            n--;
    }
    int main()
    {
           //freopen("calc.in","r",stdin);
           //freopen("calc.out","w",stdout);
           gets(s);
           len=strlen(s);
           i=0;
           init();
           if(s[0]=='-')
             {
                 n++;
                 number[n]=0;
             }
           while(i<len)
           {
                  x=0;
                  pd=0;
                  while(s[i]>=48&&s[i]<=57)//处理数字,加入栈中
                  {
                    x=x*10+s[i++]-48;
                    pd=1;
               }
               if (pd==1)
                 {
                     n++;
                     number[n]=x;
                 }
                  while(s[i]=='(')//左括号直接入栈
                    {
                        i++;
                        tot++;
                        symbol[tot]='(';
                    }
                  if(s[i]==')')//遇到右括号计算括号中的值
                    {
                        while(symbol[tot]!='(')
                          khcl();
                        tot--;//左括号出栈
                        i++;
                    }
                  else
                   if (s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]=='^')
                   {
                        j=s[i];
                        l=symbol[tot];
                        if(yx[j-40]>yx[l-40])//当前符号优先级大于栈顶元素优先级,直接入栈
                          {
                              tot++;
                              symbol[tot]=s[i];
                          }
                        else
                        {
                          while (yx[j-40]<=yx[l-40])//否则计算之前所有优先级大于等于当前符号的运算符
                           {
                             khcl();
                             l=symbol[tot];
                           }
                        tot++;
                          symbol[tot]=s[i];
                      }
                        i++;
                   }
           }
           while(tot>0)//判断栈是否为空,若不为空继续计算
            khcl();
           printf("%d",number[1]);
           return 0;
    }
    
    • 1

    信息

    ID
    1038
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者