Cod sursa(job #2278988)

Utilizator tangerine515Alex Anton tangerine515 Data 8 noiembrie 2018 19:56:50
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.34 kb
#include <fstream>
#include <cctype>
#include <string>
#include <stack>
#include <vector>

std::fstream fi("expresie.in", std::ios::in);
std::fstream fo("expresie.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::stack<long long>       val;
    std::stack<char>            op;

    for (unsigned i = 0; i < tok.length(); ++i) {
        if (tok.at(i) == ' ')
            continue;
        else if (tok.at(i) == '(')
            op.push(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.top() != '(') {
                long long b = val.back(); val.pop_back();
                long long a = val.back(); val.pop_back();

                char o = op.top(); op.pop();

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

                char o = op.top(); op.pop();

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

            op.push(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.top(); op.pop();

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

    return val.back();
}

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

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