Cod sursa(job #1122679)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 25 februarie 2014 19:50:52
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define min(a, b) a<b?a:b

using namespace std;

int n, par[1000], it;
char s[1000];

void formpar(int g)
{
    for(it; it<strlen(s); it++){
        if(s[it] == '('){
            it++;
            formpar(it-1);
        }
        if(s[it] == ')'){
            par[g] = it;
            par[it] = g;
            it++;
            return;
        }
    }
}

int oper(char c, int x, int y)
{
    if(c=='+')
        return x+y;
    if(c=='-')
        return x-y;
    if(c=='*')
        return x*y;
    if(c=='/')
        return x/y;
}

int number(int x, int y)
{
    int p=0;
    for(int i=x; i<=y; i++)
        p = p*10+(s[i]-'0');
    return p;
}

int solve(int st, int dr)
{
    int ok=0;
    if(s[st]=='(' && par[st]==dr){
        st++;
        dr--;
    }
    for(int i=dr; i>=st; i--){
        if(s[i]==')')
            i = par[i];
        else if(s[i] == '+' || s[i] =='-')
            return (oper(s[i], solve(st, i-1), solve(i+1, dr)));
    }
    for(int i=dr; i>=st; i--){
        if(s[i]==')')
            i = par[i];
        else if(s[i] == '*' || s[i] =='/')
            return (oper(s[i], solve(st, i-1), solve(i+1, dr)));
    }
    int aux;
    sscanf(s+st, "%d", &aux);
    return aux;
}

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

    gets(s);
    formpar(0);
    n = strlen(s);
    printf("%d", solve(0, n-1));
    return 0;
}