Cod sursa(job #1461667)

Utilizator Burbon13Burbon13 Burbon13 Data 16 iulie 2015 11:03:59
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

const int nmx = 100005;

char s[nmx];

void eliminare_paranteze(int &st, int &dr) {
    int grad;
    bool ok = 1;
    while(ok && s[st] == '(' && s[dr] == ')') {
        grad = 0;
        for(int i = st; i <= dr; ++i)
            if(s[i] == '(')
                ++ grad;
            else if(s[i] == ')') {
                -- grad;
                if(i != dr && not grad) {
                    ok = 0;
                    break;
                }
            }
        if(ok) {
            ++ st;
            -- dr;
        }
    }

}

int eval(int st, int dr) {
    eliminare_paranteze(st,dr);
    int grad = 0;
    /// cauta + -
    for(int i = st; i <= dr; ++i){
        if(s[i] == '(')
            ++ grad;
        else if(s[i] == ')')
            -- grad;
        else if(not grad && s[i] == '+')
            return eval(st,i-1) + eval(i+1,dr);
        else if(not grad && s[i] == '-')
            return eval(st,i-1) - eval(i+1,dr);
    }
    /// cauat * /
    for(int i = st; i <= dr; ++i){
        if(s[i] == '(')
            ++ grad;
        else if(s[i] == ')')
            -- grad;
        else if(not grad && s[i] == '*')
            return eval(st,i-1) * eval(i+1,dr);
        else if(not grad && s[i] == '/')
            return eval(st,i-1) / eval(i+1,dr);
    }
    int rez = 0;
    while(s[st] >= '0' && s[st] <= '9'){
        rez = rez * 10 + (int)s[st] - 48;
        ++ st;
    }
    return rez;
}

int main() {
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);
    scanf("%s", s);
    printf("%d", eval(0,strlen(s)-1));
    return 0;
}