Cod sursa(job #2279004)

Utilizator tangerine515Alex Anton tangerine515 Data 8 noiembrie 2018 20:13:46
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.33 kb
#include <fstream>
#include <cctype>
#include <string>
#include <stack>
#include <vector>

std::fstream fi("evaluare.in", std::ios::in);
std::fstream fo("evaluare.out", std::ios::out);

static short prioritate(char op) {
    if (op == '+' || op == '-')
        return 1;
    if (op == '*' || op == '/')
        return 2;

    return 0;
}

static long long rezolva(int a, int b, char op) {
    switch (op) {
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/': return a / b;
    }

    return 0;
}

static long long evaluare(std::string tok) {
    std::vector<long long>      val;
    std::vector<char>           op;

    for (unsigned i = 0; i < tok.length(); ++i) {
        if (tok.at(i) == ' ')
            continue;
        else if (tok.at(i) == '(')
            op.push_back(tok.at(i));
        else if (std::isdigit(tok.at(i))) {
            long long v = 0;

            while (i < tok.length() && std::isdigit(tok.at(i)))
                v = (v * 10) + (tok.at(i++) - 48);
            
            if (i < tok.length())
                if (!isdigit(tok.at(i)) && tok.at(i) != ' ') --i;

            val.push_back(v);
        }
        else if (tok.at(i) == ')') {
            while (!op.empty() && op.back() != '(') {
                long long b = val.back(); val.pop_back();
                long long a = val.back(); val.pop_back();

                char o = op.back(); op.pop_back();

                val.push_back(rezolva(a, b, o));
            }
            
            op.pop_back();
        } else {
            while (!op.empty() && prioritate(op.back()) >= prioritate(tok.at(i))) {
                long long b = val.back(); val.pop_back();
                long long a = val.back(); val.pop_back();

                char o = op.back(); op.pop_back();

                val.push_back(rezolva(a, b, o));
            }

            op.push_back(tok.at(i));
        }
    }

    while (!op.empty()) {
        long long b = val.back(); val.pop_back();
        long long a = val.back(); val.pop_back();

        char o = op.back(); op.pop_back();

        val.push_back(rezolva(a, b, o));
    }

    return val.back();
}

int main() {
    std::string expr;
    std::getline(fi, expr);

    fo << evaluare(expr);
    return 0;
}