Cod sursa(job #3331956)

Utilizator bogdan1479Luca Bogdan Alexandru bogdan1479 Data 2 ianuarie 2026 00:56:19
Problema Evaluarea unei expresii Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <cstring>

using namespace std;

const int PRIORIMAX = 2, // 0 -> +, -    ;    1 -> *, /
          LGMAX = 1e5 + 1;
const char op[3][3] = { "+-", "*/", "" };

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

char s[LGMAX], *p;

struct nod
{
    int val;
    char op;
    nod *st, *dr;

    nod(int x = 0, char y = 0, nod *z = 0, nod *t = 0)
    {
        val = x, op = y, st = z, dr = t;
    }

} *rad;

nod *expresie(int priori)
{
    nod *x, *y;
    if(priori == PRIORIMAX)
    {
        if(*p == '+' || *p == '-')
        {
            char sgn = *p++;
            x = expresie(PRIORIMAX);
            if(sgn == '-') x = new nod(0, '-', new nod(), x); // 0 - x
            return x;
        }
        if(*p == '(')
        {
            ++p;
            x = expresie(0);
            ++p;
        }
        else
        {
            for(x = new nod(); *p >= '0' && *p <= '9'; ++p)
                x->val = x->val * 10 + *p - '0';
        }
    }
    else
    {
        for(x = expresie(priori + 1); *p && strchr(op[priori], *p); x = y)
            y = new nod(0, *p++, x, expresie(priori + 1));
    }
    return x;
}

int evaluare(nod *n)
{
    switch(n->op)
    {
    case '+':
        return evaluare(n->st) + evaluare(n->dr);
    case '-':
        return evaluare(n->st) - evaluare(n->dr);
    case '*':
        return evaluare(n->st) * evaluare(n->dr);
    case '/':
        return evaluare(n->st) / evaluare(n->dr);
    default:
        return n->val;
    }
}

int main()
{
    fin >> s;
    p = s;
    rad = expresie(0);
    fout << evaluare(rad);
    return 0;
}