Cod sursa(job #2345875)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 16 februarie 2019 19:50:09
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 100005

using namespace std;

char s[N];
int l;

int cauta_adunare_scadere(int st, int dr)
{
    int nr=0;
    for(int i=dr;i>=st;i--)
        if((s[i]=='-' || s[i]=='+') && !nr)
            return i;
        else
            if(s[i]==')')
                nr++;
        else
            if(s[i]=='(')
               nr--;
    return -1;
}

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

int numar(int st, int dr)
{
    int nr=0;
    for(int i=st;i<=dr;i++)
        nr=nr*10+s[i]-'0';
    return nr;
}

int evaluare(int st, int dr)
{
    if(s[st]=='(' && s[dr]==')')
        return evaluare(st+1, dr-1);
    int ind=cauta_adunare_scadere(st, dr);
    if(ind!=-1)
    {
        int rez1=evaluare(st, ind-1);
        int rez2=evaluare(ind+1, dr);
        if(s[ind]=='+')
            return rez1+rez2;
        return rez1-rez2;
    }
    ind=cauta_inmultire_impartire(st, dr);
    if(ind!=-1)
    {
        int rez1=evaluare(st, ind-1);
        int rez2=evaluare(ind+1, dr);
        if(s[ind]=='*')
            return rez1*rez2;
        return rez1/rez2;
    }
    return numar(st, dr);
}

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

    cin.getline(s, N);
    l=strlen(s)-1;
    int rez=evaluare(0, l);
    printf("%d", rez);
    return 0;
}