Cod sursa(job #2216038)

Utilizator MoldooooooooMoldoveanu Stefan Moldoooooooo Data 24 iunie 2018 18:33:26
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <cstdio>
#include <cstring>
using namespace std;
int long Numbers[100005];
int long nr, i, L, vfchar, vfnumb, p;
char Exp[100005], Stack[100005], C;
void FormNumb(){
    nr=0; p=1;
    while(Exp[i]>='0' && Exp[i]<='9'){nr=nr+(Exp[i]-'0')*p; p*=10; i--;}
}

int main()
{
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);
    fgets(Exp, 100005, stdin);
    L=strlen(Exp);
    for(i=L-1; i>=0; i--){
        if(Exp[i]==')' || Exp[i]=='+' || Exp[i]=='-'){Stack[++vfchar]=Exp[i]; continue;}
        if(Exp[i]>='0' && Exp[i]<='9'){FormNumb(); Numbers[++vfnumb]=nr; i++;}
        if(Exp[i]=='('){
            while(Stack[vfchar]!=')'){
                    vfnumb--; vfchar--;
                    switch (Stack[vfchar+1]){
                        case '+':{Numbers[vfnumb]=Numbers[vfnumb+1]+Numbers[vfnumb]; break;}
                        default:{Numbers[vfnumb]=Numbers[vfnumb+1]-Numbers[vfnumb];}
                    }
                } vfchar--;
                if(Stack[vfchar]=='*'||Stack[vfchar]=='/'){
                  vfchar--;
                  vfnumb--;
                  if(Stack[vfchar+1]=='*')Numbers[vfnumb]=Numbers[vfnumb+1]*Numbers[vfnumb];
                     else Numbers[vfnumb]=Numbers[vfnumb+1]/Numbers[vfnumb];
                }
        }
        if((Exp[i]=='*'||Exp[i]=='/') && Exp[i-1]!=')'){
            C=Exp[i];
            i--;
            FormNumb();
            i++;
            if(C=='*')Numbers[vfnumb]=nr*Numbers[vfnumb];
            else Numbers[vfnumb]=nr/Numbers[vfnumb];
        }
        if((Exp[i]=='*'||Exp[i]=='/') && Exp[i-1]==')'){
            Stack[++vfchar]=Exp[i];
        }
    }
    while(vfnumb>=1){
                    vfnumb--; vfchar--;
                    switch (Stack[vfchar+1]){
                        case '+':{Numbers[vfnumb]=Numbers[vfnumb+1]+Numbers[vfnumb]; break;}
                        default:{Numbers[vfnumb]=Numbers[vfnumb+1]-Numbers[vfnumb];}
                    }
                }
    printf("%ld", Numbers[vfnumb]);
    return 0;
}