Cod sursa(job #1512552)

Utilizator MayuriMayuri Mayuri Data 28 octombrie 2015 11:24:11
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <cstdio>
#include <cstring>
#include <stack>
#include <vector>

using namespace std;

char s[100001];

stack <char> op;
vector <int> rasp;
vector <int> polo;

bool comp(char t) {
    int i, j;
    if(t == '-' || t == '+')
        j = 1;
    if(t == '*' || t == '/')
        j = 2;
    if(t == '(')
        j = 0;
    t = op.top();
    if(t == '-' || t == '+')
        i = 1;
    if(t == '*' || t == '/')
        i = 2;
    if(t == '(')
        i = 0;
    return i >= j;
}

int calcul(int a, int b, char t) {
    if(t == '-') {
        return a - b;
    }
    if(t == '+') {
        return a + b;
    }
    if(t == '/') {
        return a / b;
    }
    if(t == '*') {
        return a * b;
    }
}

int main() {
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);

    gets(s);

    int n;
    n = strlen(s);

    for(int i = 0; i < n; ++ i) {
        if('0' <= s[i] && s[i] <= '9') {
            int nr = 0;
            while('0' <= s[i] && s[i] <= '9') {
                nr = nr * 10 + (s[i] - '0');
                ++ i;
            }
            polo.push_back(nr);
            -- i;
        } else
        if(s[i] == '(') {
            op.push('(');
        } else
        if(s[i] == ')') {
            while(op.top() != '(') {
                polo.push_back(-op.top());
                op.pop();
            }
            op.pop();
        } else {
            while(!op.empty() && comp(s[i])) {
                polo.push_back(-op.top());
                op.pop();
            }
            op.push(s[i]);
        }
    }

    while(!op.empty()) {
        polo.push_back(-op.top());
        op.pop();
    }

    n = polo.size();

    for(int i = 0; i < n; ++ i) {
        if(polo[i] >= 0) {
            //printf("%d ", polo[i]);
            rasp.push_back(polo[i]);
        } else {
            //printf("%c ", polo[i]);
            int q, m;
            m = rasp.size();
            q = calcul(rasp[m - 2], rasp[m - 1], -polo[i]);
            rasp.pop_back();
            rasp.pop_back();
            rasp.push_back(q);
        }
    }

    printf("%d\n", rasp[0]);

    return 0;
}