Cod sursa(job #1974721)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 28 aprilie 2017 16:15:39
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <cstring>

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

#define pb push_back
#define ll long long
const int strMax = 1e5 + 5;
const int lvlMax = 2;

// se construieste arborele expresiei fara transformarea in forma postfixata
// vezi sursa 5

int N;
char str[strMax],*p;
const char lvlOp[2][3] = {'+','-','\0','*','/','\0'};

struct nod {
    int nr;
    char c;
    nod *st,*dr;
    nod(int _nr = 0,char _c = '\0',nod *_st = nullptr,nod *_dr = nullptr) {
        nr = _nr;
        c = _c;
        st = _st;
        dr = _dr;
    }
};

nod* eval(int);
int compute(nod*);
//
// compute(n) = numarul asociat nodului daca este un numar
//        sau = rezultatul operatiei asociate nodului altfel

int main() {

    in>>(str);
    p = str;

    nod *root = eval(0);

    out<<compute(root)<<'\n';

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

nod* eval(int lvl) {
    nod *ans;
    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 nod(nr);
        }
    }
    else {
        for(ans = eval(lvl+1); strchr(lvlOp[lvl],*p) != nullptr && *strchr(lvlOp[lvl],*p) != '\0'; ) {
            char op = *p++;
            ans = new nod(0,op,ans,eval(lvl+1));
        }
    }

    return ans;
}

int compute(nod *n) {
    switch (n->c) {
    case '+': return compute(n->st) + compute(n->dr);
    case '-': return compute(n->st) - compute(n->dr);
    case '*': return compute(n->st) * compute(n->dr);
    case '/': return compute(n->st) / compute(n->dr);
    default: return n->nr;
    }
}