Cod sursa(job #1889550)

Utilizator vladcainamisirVlad Cainamisir vladcainamisir Data 22 februarie 2017 19:31:08
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.99 kb
#include<cstdio>
#include<cstring>
#include<cctype>
int priority(char op)
{
    int p;
    switch(op)
    {
        case '+':p=1;break;
        case '-':p=1;break;
        case '*':p=2;break;
        case '/':p=2;break;
    }
    return p;
}

    char op[100005];
    int rez[100005];
    char s[100005];
    int top,top2;
int main(){
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    int n,i,nr;
    char ch;
    gets(s);
    n=strlen(s);
    for(i=0;i<n;i++)
    {
        if(s[i]=='(')
            op[++top]='(';
        else if(isdigit(s[i]))
        {
            nr=0;
            while(i<n && isdigit(s[i]))
            {
                nr=nr*10+s[i]-'0';
                i++;
            }
            i--;
            rez[++top2]=nr;
        }
        else
            if(s[i]==')')
        {
            while(top>0&&op[top]!='(')
            {
                switch(op[top])
                  {
                      case '+':rez[top2-1]+=rez[top2];
                      top2--;
                      break;
                      case '-':rez[top2-1]-=rez[top2];
                      top2--;
                      break;
                      case '*':rez[top2-1]*=rez[top2];
                      top2--;
                      break;
                      case '/':rez[top2-1]/=rez[top2];
                      top2--;
                      break;
                  }
                  top--;
            }
            top--;
        }
        else
            if(top==0||op[top]=='('||priority(s[i])>priority(op[top]))
               op[++top]=s[i];
        else
        {
            while(top>0&&op[top]!='('&&priority(s[i])<=priority(op[top]))
            {
                ch=op[top];

                switch(op[top])
                  {
                      case '+':rez[top2-1]+=rez[top2];
                      top2--;
                      break;
                      case '-':rez[top2-1]-=rez[top2];
                      top2--;
                      break;
                      case '*':rez[top2-1]*=rez[top2];
                      top2--;
                      break;
                      case'/':rez[top2-1]/=rez[top2];
                      top2--;
                      break;
                  }
                  top--;
            }
            op[++top]=s[i];
        }
    }
    for(top;top>=1;top--)
    {
    switch(op[top])
                  {
                      case '+':rez[top2-1]+=rez[top2];
                      top2--;
                      break;
                      case '-':rez[top2-1]-=rez[top2];
                      top2--;
                      break;
                      case '*':rez[top2-1]*=rez[top2];
                      top2--;
                      break;
                      case'/':rez[top2-1]/=rez[top2];
                      top2--;
                      break;
                  }

    }
    printf("%d",rez[1]);
    return 0;
}