Cod sursa(job #3268677)

Utilizator XxThornadoxXStoica Teodora XxThornadoxX Data 16 ianuarie 2025 18:03:41
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

string expr;

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

bool paranteze(int st, int dr)
{
    if (expr[st] == '(' && expr[dr] == ')')
    {
        int cnt = 0;
        for (int i = st; i <= dr; ++i)
        {
            if (expr[i] == '(')
                cnt++;
            else if (expr[i] == ')')
                cnt--;
            if (cnt == 0 && i < dr)
                return false;
        }
        return true;
    }
    return false;
}

int solve(int st, int dr)
{
    if (st > dr)
        return 0;

    if (paranteze(st, dr))
        return solve(st + 1, dr - 1);

    int level = 0;
    for (int i = dr; i >= st; i--)
    {
        if (expr[i] == ')')
            level++;
        else if (expr[i] == '(')
            level--;
        else if (level == 0 && (expr[i] == '+' || expr[i] == '-'))
        {
            int left = solve(st, i - 1);
            int right = solve(i + 1, dr);
            return expr[i] == '+' ? left + right : left - right;
        }
    }

    level = 0;
    for (int i = dr; i >= st; i--)
    {
        if (expr[i] == ')')
            level++;
        else if (expr[i] == '(')
            level--;
        else if (level == 0 && (expr[i] == '*' || expr[i] == '/'))
        {
            int left = solve(st, i - 1);
            int right = solve(i + 1, dr);
            return expr[i] == '*' ? left * right : left / right;
        }
    }

    int num = 0;
    for (int i = st; i <= dr; ++i) {
        if (isdigit(expr[i])) num = num * 10 + (expr[i] - '0');
    }
    return num;
}

int evaluate(string s)
{
    expr = s;
    return solve(0, expr.size() - 1);
}

int main()
{
    string s;
    fin >> s;
    fout << evaluate(s);
    return 0;
}