Cod sursa(job #1073239)

Utilizator nytr0gennytr0gen nytr0gen Data 5 ianuarie 2014 20:22:31
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;

stack<char> chr;
stack<int>  nbr;

inline void eval() {
    int op2 = nbr.top(); nbr.pop();
    int op1 = nbr.top(); nbr.pop();
    char op = chr.top(); chr.pop();

    switch (op) {
        case '+':
            nbr.push(op1+op2);
            break;
        case '-':
            nbr.push(op1-op2);
            break;
        case '*':
            nbr.push(op1*op2);
            break;
        case '/':
            nbr.push(op1/op2);
            break;
    }
}

int main() {
    int n;
    char exp[100002], *c = exp;

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

    scanf("%s", exp);

    while (*c) {
        if (*c >= '0' && *c <= '9') {
            n = 0;
            while (*c >= '0' && *c <= '9') {
                n = n*10-'0'+*c++;
            }
            nbr.push(n);
        } else {
            if (strchr("(+-*/", *c) != NULL) {
                if (!chr.empty() && strchr("*/", chr.top()) != NULL)
                    eval();
                chr.push(*c);
            } else if (*c == ')') {
                do {
                    eval();
                } while(!chr.empty() && chr.top() != '(');
                if (!chr.empty() && chr.top() == '(')
                    chr.pop();
            }
            c++;
        }
    }
    while(!chr.empty()) {
        eval();
    }

    printf("%d", nbr.top());


    return 0;
}