Cod sursa(job #3363695)

Utilizator marelucaMare Luca Ghita mareluca Data 21 august 2026 13:51:33
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>

const int NMAX = (1 << 17);
const int LMAX = 2; 

std::string str; 
size_t idx;

bool is_math_symbol(char c) 
{
    return (
        c == '*' ||
        c == '/' || 
        c == '+' ||
        c == '-'
    );
}

struct node 
{
    int val;
    char op;

    node *l, *r;
    node(int _val = 0, char _op = 0, node *_l = 0, node *_r = 0) : val(_val), op(_op), l(_l), r(_r) {};
} *arb;

// Construction of the expression tree
node *expr(int lev)
{
    node *x, *y;

    if(lev == LMAX)
    {
        if(str[idx] == '(')
        {
            ++idx;
            x = expr(0);
            ++idx;
        }
        else
        {
            for(x = new node(); str[idx] >= '0' && str[idx] <= '9'; ++idx)
            {
                x->val = x->val * 10 + str[idx] - '0';
            }
        }
    }
    else 
    {
        for(x = expr(lev + 1); is_math_symbol(str[idx]); x = y, ++idx)
        {
            y = new node(0, str[idx], x, expr(lev + 1));
        }
    }

    return x;
}

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

std::ifstream fin("expresie.in");
std::ofstream fout("expresie.out");

int main()
{
    fin >> str;
    arb = expr(0);
    fout << eval(arb);
    return 0;
}