Cod sursa(job #2302937)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 15 decembrie 2018 11:43:42
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.55 kb
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;

char s[100000];
int n;

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

bool plusMinus(int start, int fin, int &i, bool &semn)
{
    int parant = 0;
    for(i = fin; i>=start; i--)
    {
        if(s[i] == ')')
        {
            parant++;
        }
        else if(s[i] == '(')
        {
            parant--;
        }
        else if(parant == 0)
        {
            if(s[i] == '+')
            {
                semn = 0;
                return true;
            }
            else if(s[i] == '-')
            {
                semn = 1;
                return true;
            }
        }
    }
    i = start;
    return false;
}

bool inmImp(int start, int fin, int &i, bool &semn)
{
    int parant = 0;
    for(i = fin; i>= start; i--)
    {
        if(s[i] == ')')
        {
            parant++;
        }
        else if(s[i] == '(')
        {
            parant--;
        }
        else if(parant == 0)
        {
            if(s[i] == '*')
            {
                semn = 0;
                return true;
            }
            else if(s[i] == '/')
            {
                semn = 1;
                return true;
            }
        }
    }
    i = start;
    return false;
}

int divEtImp(int start, int fin)
{
    int a, b;
    int i = 0;
    bool semn;

    if(plusMinus(start, fin, i, semn))
    {
        if(semn == 0)
        {
            a = divEtImp(start, i-1);
            b = divEtImp(i+1, fin);
            return a+b;
        }
        else
        {
            a = divEtImp(start, i-1);
            b = divEtImp(i+1, fin);
            return a-b;
        }
    }
    else if(inmImp(start, fin, i, semn))
    {
        if(semn == 0)
        {
            a = divEtImp(start, i-1);
            b = divEtImp(i+1, fin);
            return a*b;
        }
        else
        {
            a = divEtImp(start, i-1);
            b = divEtImp(i+1, fin);
            return a/b;
        }
    }
    if(s[start] == '(' && s[fin] == ')')
        return divEtImp(start+1, fin-1);
    else
    {
        return numar(start, fin);
    }
}

void rez()
{
    scanf("%s", s);
    n = strlen(s);
    printf("%d", divEtImp(0, n-1));
}

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