Cod sursa(job #2220283)

Utilizator MoldooooooooMoldoveanu Stefan Moldoooooooo Data 11 iulie 2018 09:58:57
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <cstring>
using namespace std;
char Exp[100005];
int long LL, i, nr;
int Importance[48];
int long FormNumber(int long i){
    nr=0;
    while(Exp[i]>='0' && Exp[i]<='9')
        {nr=nr*10+(Exp[i]-'0'); i++;}
    return i;
}
int long Evaluate(int long a, int long b, char c){
    switch (c){
        case '*':{a=a*b; break;}
        case '/':{a=a/b; break;}
        case '+':{a=a+b; break;}
        default:a=a-b;
    }
    return a;
}
    char Stack[100005];
    int long Numbers[100005], vfchar, vfnumb;


int main()
{
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);
    Exp[0]='(';
    fgets(Exp+1, 100005, stdin);
    LL=strlen(Exp);
    Exp[LL-1]=')';

    Importance[42]=Importance[47]=2;
    Importance[43]=Importance[45]=1;
    int long i=0, Result;
    while(i<LL){
        if(Exp[i]=='('){ Stack[++vfchar]='(';}
        if(Exp[i]>='0' && Exp[i]<='9'){i=FormNumber(i); Numbers[++vfnumb]=nr; i--;}
        if(Exp[i]>=42 && Exp[i]<=47){
            while(vfchar && Importance[Exp[i]]<=Importance[Stack[vfchar]]){
                Numbers[vfnumb-1]=Evaluate(Numbers[vfnumb-1], Numbers[vfnumb], Stack[vfchar]);
                vfnumb--; vfchar--;
            }
            Stack[++vfchar]=Exp[i];
        }
        if(Exp[i]==')'){while(Stack[vfchar]!='('){
        Numbers[vfnumb-1]=Evaluate(Numbers[vfnumb-1], Numbers[vfnumb], Stack[vfchar]);
        vfnumb--; vfchar--;
    }
        vfchar--;}

        i++;
    }

    printf("%ld", Numbers[vfnumb]);
    return 0;
}