Cod sursa(job #1758512)

Utilizator isa_fares_mudiFares Mohamad isa_fares_mudi Data 17 septembrie 2016 13:28:55
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#include <cstring>
using namespace std;
char s[200000];
int poz, n;
int numar();
int parant();
int numar() {
    if ( s[poz]=='(' ) {
        ++poz;
        return parant();
    }
    int val=0;
    while ( s[poz]>='0' && s[poz]<='9' && poz < n )  {
        val = val * 10 + s[poz] - '0';
        ++poz;
    }
    return val;
}
inline int ec ( int a, int b, char s ) {
    switch ( s ) {
        case '+':return a+b;
        case '-':return a-b;
        case '*':return a*b;
        case '/':return a/b;

    }
}
int parant() {
    int a, b, c;
    char s1, s2;
    a = numar();
    if ( poz == n ||s[poz]==')' ) {
        ++poz;
        return a;
    }
    s1 = s[poz];
    ++poz;
    b = numar();
    if ( poz == n || s[poz] == ')' ) {
        ++poz;
        return ec ( a, b, s1 );
    }
    while( poz != n && s[poz] != ')' ) {
        s2 = s[poz];
        ++poz;
        c = numar();
        if ( s1 == '*' || s1 == '/') {
            a = ec ( a, b, s1 );
            b = c;
            s1 = s2;
        }
        else {
            if ( s2 == '*' || s2 == '/' )
                b = ec ( b, c, s2 );
            else {
                a= ec ( a, b, s1 );
                b = c;
                s1 = s2;
            }
        }
    }
    a = ec ( a, b, s1 );
    ++poz;
    return a;
}
int main() {
    freopen ( "evaluare.in", "r", stdin );
    freopen ( "evaluare.out", "w", stdout );
    gets ( s );
    n = strlen ( s );
    printf ( "%d", parant() );
    return 0;
}