Cod sursa(job #1977584)

Utilizator MaligMamaliga cu smantana Malig Data 5 mai 2017 16:02:10
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");

#define pb push_back
#define ll long long
const int NMax = 1e5 + 5;
const int lvlMax = 2;
const char lvlOp[2][3] = {{'+','-','\0'},{'*','/','\0'}};

char str[NMax],*p = str;

struct nodArb {
    int nr;
    char op;
    nodArb *st,*dr;
    nodArb (int _nr = 0,char _op = '\0',nodArb *_st = 0,nodArb *_dr = 0) {
        nr = _nr;
        op = _op;
        st = _st;
        dr = _dr;
    }
};

nodArb *eval(int);
int compute(nodArb*);

int main()
{
    in>>(str);

    nodArb *root = eval(0);
    out<<compute(root)<<'\n';

    in.close();out.close();
    return 0;
}

nodArb *eval(int lvl) {
    nodArb *ans = 0;
    //cout<<(p - str + 1)<<' '<<lvl<<'\n';
    if (lvl == lvlMax) {
        if (*p == '(') {
            ++p;
            ans = eval(0);
            ++p;
        }
        else {
            int nr = 0;
            while ('0' <= *p && *p <='9') {
                nr = nr * 10 + *p++ - '0';
            }
            ans = new nodArb(nr);
        }
    }
    else {
        for (ans = eval(lvl+1); *p != '\0' && strchr(lvlOp[lvl],*p);) {
            char op = *p++;
            ans = new nodArb(0,op,ans,eval(lvl+1));
        }
    }
    //cout<<(p - str + 1)<<' '<<lvl<<' '<<ans<<'\n';
    return ans;
}

int compute(nodArb* nod) {
    nodArb *x,*y;
    x = nod -> st;
    y = nod -> dr;

    switch(nod -> op) {
    case '+': return compute(x) + compute(y);
    case '-': return compute(x) - compute(y);
    case '*': return compute(x) * compute(y);
    case '/': return compute(x) / compute(y);
    default: return nod -> nr;
    }
}