Cod sursa(job #3256648)

Utilizator theshadowcodertheshadowcoder theshadowcoder Data 15 noiembrie 2024 17:22:38
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

const int MAX = 1e5 + 7;

char s[MAX];

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

int semn(int st, int dr, char s1, char s2)
{
    int nr = 0;

    for (int i = dr; i >= st; --i)
    {
        if (s[i] == ')')
        {
            ++nr;
        }
        if (s[i] == '(')
        {
            --nr;
        }
        if (!nr)
        {
            if (s[i] == s1 || s[i] == s2)
            {
                return i;
            }
        }
    }
    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 eval(int st, int dr)
{
    int p = semn(st, dr, '+', '-');
    if (p != -1)
    {
        int e1 = eval(st, p - 1);
        int e2 = eval(p + 1, dr);
        if (s[p] == '+')
        {
            return e1 + e2;
        }
        return e1 - e2;
    }

    p = semn(st, dr, '*', '/');
    if (p != -1)
    {
        int e1 = eval(st, p - 1);
        int e2 = eval(p + 1, dr);
        if (s[p] == '*')
        {
            return e1 * e2;
        }
        return e1 / e2;
    }

    if (s[st] == '(' && s[dr] == ')')
    {
        return eval(st + 1, dr - 1);
    }
    return numar(st, dr);
}

int main()
{
    fin.getline(s, MAX);
    fout << eval(0, strlen(s) - 1);
    return 0;
}