Cod sursa(job #3182109)

Utilizator alexsimedreaAlexandru Simedrea alexsimedrea Data 8 decembrie 2023 17:43:41
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <string>

int search(const std::string &expression, int st, int dr, char op1, char op2) {
    int cnt = 0;
    for (int i = dr; i >= st; --i) {
        if (expression[i] == ')') {
            ++cnt;
        }
        if (expression[i] == '(') {
            --cnt;
        }
        if (cnt == 0 && (expression[i] == op1 || expression[i] == op2)) {
            return i;
        }
    }
    return -1;
}

int num(const std::string &expression, int st, int dr) {
    int number = 0;
    for (int i = st; i <= dr; ++i) {
        number = number * 10 + (expression[i] - '0');
    }
    return number;
}

int solve(const std::string &expression, int st, int dr) {
    int pos = search(expression, st, dr, '+', '-');
    if (pos != -1) {
        int expr1 = solve(expression, st, pos - 1);
        int expr2 = solve(expression, pos + 1, dr);
        if (expression[pos] == '+') {
            return expr1 + expr2;
        } else {
            return expr1 - expr2;
        }
    }
    pos = search(expression, st, dr, '*', '/');
    if (pos != -1) {
        int expr1 = solve(expression, st, pos - 1);
        int expr2 = solve(expression, pos + 1, dr);
        if (expression[pos] == '*') {
            return expr1 * expr2;
        } else {
            return expr1 / expr2;
        }
    }
    if (expression[st] == '(' && expression[dr] == ')') {
        return solve(expression, st + 1, dr - 1);
    }
    return num(expression, st, dr);
}

int main() {
    std::ifstream fin("evaluare.in");
    std::ofstream fout("evaluare.out");

    std::string expression;
    getline(fin, expression);
    fout << solve(expression, 0, (int) expression.size() - 1);
    return 0;
}