Cod sursa(job #2269997)

Utilizator AndreiVisoiuAndrei Visoiu AndreiVisoiu Data 26 octombrie 2018 21:30:31
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#include <cstring>

using namespace std;

const int LMAX = 2,
          NMAX = 100001;

struct nod {
    int val;
    char op;
    nod *l, *r;

    nod(int a = 0, char b = 0, nod *c = 0, nod *d = 0): val(a), op(b), l(c), r(d)
    {}
};

char op[2][4] = {"+-", "*/"};
char S[100001], *p;
nod *R;

nod *construct(int lev) {
    nod *x, *y;

    if(lev == LMAX) {
        if(*p == '(') ++p, x = construct(0), ++p;
        else for(x = new nod(); *p >= '0' && *p <= '9'; ++p)
            x->val = x->val * 10 + *p - '0';
    } else
        for(x = construct(lev+1); strchr(op[lev], *p); x = y)
            y = new nod(0, *p++, x, construct(lev+1));
    return x;
}

int eval(nod *n) {
    switch(n->op) {
        case '+': return eval(n->l) + eval(n->r);
        case '-': return eval(n->l) - eval(n->r);
        case '*': return eval(n->l) * eval(n->r);
        case '/': return eval(n->l) / eval(n->r);
        default: return n->val;
    }
}

int main()
{
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);

    fgets(S, NMAX, stdin);
    p = S;
    R = construct(0);
    printf("%i", eval(R));
    return 0;
}