Cod sursa(job #1892094)

Utilizator dan.marculetFII MarculetDan dan.marculet Data 24 februarie 2017 17:41:30
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <cstdio>
#include <string>
#include <stack>

#define NAME "evaluare"
#define MAXN 100001

using namespace std;

auto fin = fopen(NAME ".in", "r");
auto fout = fopen(NAME ".out", "w");

string e;
int result;
stack<int> a;
stack<char> b;

void input() {
    char proxy[MAXN];
    fscanf(fin, "%s", proxy);
    e = proxy;
}

void output() {
    fprintf(fout, "%d\n", result);
}

bool isOperator(char c) {
    auto operators = {'+', '/', '*', '-'};
    for (auto op: operators)
        if (c == op)
            return true;
    return false;
}

int precedence(char c) {
    switch (c) {
        case '+':
        case '-':
            return 2;
        case '*':
        case '/':
            return 1;
    }
    return 3;
}

bool isOperand(char c) {
    return c >= '0' && c <= '9';
}

int applyOperator(char op, int v1, int v2) {
    // printf("Calculating %d%c%d\n", v1, op, v2);
    switch(op) {
        case '+': return v1 + v2;
        case '-': return v1 - v2;
        case '*': return v1 * v2;
        case '/': return v1 / v2;
    }
    return 0;
}

void applyComputation() {
    auto v2 = a.top(); a.pop();
    auto v1 = a.top(); a.pop();
    a.push(applyOperator(b.top(), v1, v2));
    b.pop();
}

void solve() {
    for (auto i = 0u; i < e.size(); ++i) {
        if (isOperand(e[i])) {
            auto number = 0;
            while (i < e.size() && isOperand(e[i]))
                number = number * 10 + e[i++] - '0';
            --i;
            a.push(number);
        }
        else if (isOperator(e[i])) {
            while (!b.empty() && precedence(b.top()) <= precedence(e[i]))
                applyComputation();
            b.push(e[i]);
        }
        else if (e[i] == '(') {
            // printf("Opening brace\n");
            b.push(e[i]);
        }
        else if (e[i] == ')') {
            // printf("Closing brace\n");
            while (b.top() != '(')
                applyComputation();
            b.pop();
        }
    }
    while (!b.empty())
        applyComputation();
    result = a.top();
}

int main() {
    input();
    solve();
    output();
    return 0;
}