Cod sursa(job #1615005)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 26 februarie 2016 12:54:48
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>

using namespace std;

const int MAX_N = 100000;

char E[MAX_N + 1];

char op[MAX_N];
int ST[MAX_N];

int priority[256];

int main() {
    ifstream fin("evaluare.in");
    ofstream fout("evaluare.out");
    fin.tie(0);
    ios_base::sync_with_stdio(false);
    int opStack, ss;

    fin >> E; fin.close();

    priority['*'] = 2; priority['/'] = 2;
    priority['+'] = 1; priority['-'] = 1;

    auto doOp = [&] () -> void {
        if (op[opStack] == '+') {
            ST[ss - 1] += ST[ss];
        } else if (op[opStack] == '-') {
            ST[ss - 1] -= ST[ss];
        } else if (op[opStack] == '*') {
            ST[ss - 1] *= ST[ss];
        } else {
            ST[ss - 1] /= ST[ss];
        }
    };

    op[0] = '$';
    opStack = 1;
    ss = 0;
    for (int i = 0; E[i]; ++ i) {
        if (E[i] == '(') {
            op[opStack++] = '(';
        } else if (E[i] == ')') {
            while (op[--opStack] != '(') {
                ss--;
                doOp();
            }
        } else {
            if (isdigit(E[i])) {
                if (i == 0 || !isdigit(E[i - 1])) {
                    ST[ss++] = 0;
                }
                ST[ss - 1] = (10 * ST[ss - 1] + (E[i] - '0'));
            } else {
                while (priority[op[opStack - 1]] >= priority[E[i]]) {
                    ss--;
                    opStack--;
                    doOp();
                }
                op[opStack++] = E[i];
            }
        }
    }

    while (opStack > 1) {
        ss--;
        opStack--;
        doOp();
    }

    fout << ST[0] << '\n';
    fout.close();

    return 0;
}