Cod sursa(job #1461710)

Utilizator zertixMaradin Octavian zertix Data 16 iulie 2015 12:22:45
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;
char s[100000];
int verif(int l,int l1) {
    int k=0;
    for (int i=l; i<=l1; ++i)
        if (s[i]=='(')
            k++;
        else if (s[i]==')')
            k--;
    if (k<0)
        return 0;
    if (k==0)
        return 0;
}
int operatie(int l,int l1,char c1,char c2) {
    int ok=0;
    for (int i=l1; i>=l; --i)

        if (s[i]=='(')
            ok++;

        else if (s[i]==')')
            ok--;
        else if (s[i]==c1 && ok==0 || s[i]==c2 && ok==0)
            return i;
    return -1;
}
int rezolv(int l,int l1) {
    int x=verif(l,l1);
    while (s[l]=='(' && s[l1]==')' && x) {
        l++;
        l1--;
        x=verif(l,l1);
    }
    int v=operatie(l,l1,'+','-');
    if (v>=0) {
        if (s[v]=='+')
            return rezolv(v+1,l1)+rezolv(l,v-1);
        else if (s[v]=='-')
            return rezolv(l,v-1)-rezolv(v+1,l1);
    }

    else {
        int v=operatie(l,l1,'/','*');
        if (v>=0) {
            if (s[v]=='*')
                return rezolv(v+1,l1)*rezolv(l,v-1);
            else if (s[v]=='/')
                return rezolv(l,v-1)/rezolv(v+1,l1);
        } else {
            int n=0;
            for (int c=l; c<=l1; c++)
                n=n*10+s[c]-'0';
            return n;
        }
    }

}

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