Cod sursa(job #1650378)

Utilizator Burbon13Burbon13 Burbon13 Data 11 martie 2016 18:02:15
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>

using namespace std;

const int lmx = 100002;

char s[lmx];

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

int eval(int st, int dr) {
    if(s[st] == '(' && s[dr] == ')')
        scad_paranteze(st,dr);
    int nr = 0;
    for(int i = dr; i >= st; --i) {
        if(s[i] == ')')
            ++ nr;
        else if(s[i] == '(')
            -- nr;
        if(not nr && s[i] == '+')
            return eval(st,i-1) + eval(i+1,dr);
        else if(not nr && s[i] == '-')
            return eval(st,i-1) - eval(i+1,dr);
    }
    nr = 0;
    for(int i = dr; i >= st; --i) {
        if(s[i] == ')')
            ++ nr;
        else if(s[i] == '(')
            -- nr;
        if(not nr && s[i] == '*')
            return eval(st,i-1) * eval(i+1,dr);
        else if(not nr && s[i] == '/')
            return eval(st,i-1) / eval(i+1,dr);
    }
    return atoi(s+st);
}

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