Cod sursa(job #2049069)

Utilizator osiaccrCristian Osiac osiaccr Data 26 octombrie 2017 20:26:24
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#include <fstream>
#define DEF 100002

using namespace std;

ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");

char c[DEF];

int i, stiva[DEF], k, v[DEF], k2, cod[200];

void paranteza_inchisa () {
    while (k) {
        if (stiva[k] == '(') {
            -- k;
            break;
        }
        v[++ k2] = cod[stiva[k]];
        -- k;
    }
}

void ad_sc (char x) {
    while (stiva[k] == '+' || stiva[k] == '-') {
        v[++ k2] = cod[stiva[k]];
        -- k;
    }
    stiva[++ k] = x;
}

void imu_imp (char x) {
    while (stiva[k] == '*' || stiva[k] == '/' || stiva[k] == '+' || stiva[k] == '-') {
        v[++ k2] = cod[stiva[k]];
        -- k;
    }
    stiva[++ k] = x;
}

void numar () {
    int r = 0;
    while (c[i] >= '0' && c[i] <= '9') {
        r = r * 10 + c[i] - '0';
        ++ i;
    }
    -- i;
    v[++ k2] = r;
}

int main () {
    cod['*'] = DEF + 1; //100003
    cod['/'] = DEF + 2; //100004
    cod['+'] = DEF + 3; //100005
    cod['-'] = DEF + 4; //100006

    fin >> c + 1;
    for (i = 1; c[i] != 0; i++) {
        switch (c[i]) {
            case '(' : stiva[++ k] = '(';
                       break;
            case ')' : paranteza_inchisa ();
                       break;
            case '+' : ad_sc ('+');
                       break;
            case '-' : ad_sc ('-');
                       break;
            case '*' : imu_imp ('*');
                       break;
            case '/' : imu_imp  ('/');
                       break;
            default : numar ();
        }
    }
    while (k) {
        v[++ k2] = cod[stiva[k]];
        -- k;
    }
    for (int i = 1; i <= k2; i++) {
        fout << v[i] << " ";
    }
    fout << "\n";
    for (int i = 1; i <= k2; i++) {
        if (v[i] < DEF) {
            stiva [++ k] = v[i];
            continue;
        }
        if (v[i] == DEF + 1) { // *
            stiva[k - 1] *= stiva[k];
            -- k;
        }
        if (v[i] == DEF + 2) { // /
            stiva[k - 1] /= stiva[k];
            -- k;
        }
        if (v[i] == DEF + 3) { // +
            stiva[k - 1] += stiva[k];
            -- k;
        }
        if (v[i] == DEF + 4) { // -
            stiva[k - 1] -= stiva[k];
            -- k;
        }
    }
    fout << stiva[1];
    return 0;
}