Cod sursa(job #2111646)

Utilizator victorv88Veltan Victor victorv88 Data 22 ianuarie 2018 15:40:42
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

char sir[100005];
int st, dr, p;

void verifparanteze(int &st, int &dr)
{
    int nr=0, ok=1;
    while (sir[st]=='(' && sir[dr]==')' && nr==0 && ok==1)
    {
        nr=0;
        for (int i=st+1; i<=dr-1; i++)
        {
            if (sir[i]==')')
                nr--;
            else if (sir[i]=='(')
                nr++;
            if (nr<0)
                ok=0;
        }
        if (nr==0 && ok==1)
            st++,dr--;
    }
}

int cautare(char c1, char c2, int st, int dr)
{
    int nr=0;
    for (int i=dr; i>=st; i--)
    {
        if (sir[i]==')')
            nr--;
        else if (sir[i]=='(')
            nr++;
        if ((sir[i]==c1 || sir[i]==c2)&& nr==0)
            return i;
    }
    return -1;
}

int chrtoint(int st, int dr)
{
    int aux=0;
    for (int i=st; i<=dr; i++)
    {
        aux=aux*10+(sir[i]-'0');
    }
    return aux;
}

int evaluare(int st, int dr)
{
    verifparanteze(st,dr);
    int p=cautare('+','-',st,dr);
    if (p==-1)
    {
        p=cautare('*','/',st,dr);
        if (p==-1)
        {
            return chrtoint(st, dr);
        }
    }
    int v1=evaluare(st,p-1);
    int v2=evaluare(p+1,dr);
    switch(sir[p])
    {
        case '+':return v1+v2;
        case '-':return v1-v2;
        case '*':return v1*v2;
        case '/':return v1/v2;
    }
}

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    fgets(sir,100001,stdin);
    int n=strlen(sir);
    if (sir[n-1]=='\n')
    {
        sir[n-1]=='\0';
        n--;
    }
    printf("%d",evaluare(0,n-1));
    return 0;
}