Cod sursa(job #3176721)

Utilizator radustn92Radu Stancu radustn92 Data 27 noiembrie 2023 17:42:29
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstdio>
#include <cassert>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

string expr;

vector<vector<char>> ops = {{'+', '-'}, {'*', '/'}};

int applyOp(int lhs, int rhs, char op) {
    switch (op) {
        case '+': {
            return lhs + rhs;
        }
        case '-': {
            return lhs - rhs;
        }
        case '*': {
            return lhs * rhs;
        }
        case '/': {
            return lhs / rhs;
        }
    }
}

bool matches(char op, int priority) {
    for (auto& cand : ops[priority]) {
        if (cand == op) {
            return true;
        }
    }
    return false;
}

int eval(string& expr, size_t& idx, int priority) {
    if (priority == ops.size()) {
        assert(isdigit(expr[idx]) || expr[idx] == '(');
        if (isdigit(expr[idx])) {
            int result = 0;
            while (idx < expr.size() && isdigit(expr[idx])) {
                result = result * 10 + expr[idx++] - '0';
            }
            return result;
        }
        int result = eval(expr, ++idx, 0);
        idx++;
        return result;
    }
    int result = eval(expr, idx, priority + 1);
    while (idx < expr.size() && matches(expr[idx], priority)) {
        char op = expr[idx++];
        result = applyOp(result, eval(expr, idx, priority + 1), op);
    }
    return result;
}

int main() {
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);
    cin >> expr;
    size_t idx = 0;
    cout << eval(expr, idx, 0) << "\n";
    return 0;
}