Cod sursa(job #3176716)

Utilizator radustn92Radu Stancu radustn92 Data 27 noiembrie 2023 17:36:54
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 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;
        }
    }
}

int eval(string& expr, int& 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;
        } else if (expr[idx] == '(') {
            int result = eval(expr, ++idx, 0);
            idx++;
            return result;
        }
    }
    int result = eval(expr, idx, priority + 1);
    while (idx < expr.size() && find(ops[priority].begin(), ops[priority].end(), expr[idx]) != ops[priority].end()) {
        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;
    int idx = 0;
    cout << eval(expr, idx, 0) << "\n";
    return 0;
}