Cod sursa(job #2961970)

Utilizator vmnechitaNechita Vlad-Mihai vmnechita Data 7 ianuarie 2023 15:25:03
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.37 kb
#include <bits/stdc++.h>

using  namespace std;

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

struct Nod
{
    char* informatie;
    struct Nod *st, *dr;
};

/*
char* SetUpConstruiesteArbore(char *s)
{
    int n = strlen(s), m, i, j, x, cx;
    char* Operatori = "()+-*^/|&";
    char* Raspuns;

    j = 0;
    for(i = 0; i < n; i++) if(s[i] != ' ') s[j++] = s[i];
    s[j] = '\n', n = j;

    for(i = 0; i < n; i++)
    {
        if(strchr(Operatori, s[i]) != nullptr) Raspuns += s[i];
        else if(s[i] < '0' || s[i] > 9)
        {
            char* nume = "";
            while(i < n && s[i] != '.' && strcmp(Operatori, s[i]) == nullptr)
            {
                nume += s[i];
                i++;
            }
            cx = x = getIntVal(nume);
            while(cx)
            {
                cx /= 10;
                Raspuns += '0';
            }
            m = strlen(R), j = 0;
            while(x)
            {
                R[m-1-j] += x % 10;
                x /= 10;
                j++;
            }
        }
    }

    return Raspuns;
}
*/

int Prioritate(char Operator)
{
    if(Operator == '+' || Operator == '-') return 1;
    else if(Operator == '/' || Operator == '*') return 2;
}

struct Nod* ConstruiesteArbore(char* s)
{
    int n = int(strlen(s)), i, j, capat1 = -1, capat2 = -1;
    struct Nod *s1[100005], *s2[100005];

    for(i = 0; i < n; i++)
    {
        if(s[i] >= '0' && s[i] <= '9')
        {
            j = i;
            while(j < n && s[j] >= '0' && s[j] <= '9') j++;
            if(j < n && s[j] == '.')
            {
                while(j < n && s[j] >= '0' && s[j] <= '9') j++;
            }

            s1[++capat1] = (struct Nod*) (malloc(sizeof(struct Nod)));
            s1[capat1]->informatie = new char[j-i+1], s1[capat1]->st = nullptr, s1[capat1]->dr = nullptr;

            j = i;
            while(j < n && s[j] >= '0' && s[j] <= '9')
            {
                s1[capat1]->informatie[j-i] = s[j];
                j++;
            }
            if(j < n && s[j] == '.')
            {
                s1[capat1]->informatie[j-i] = '.';
                while(j < n && s[j] >= '0' && s[j] <= '9')
                {
                    s1[capat1]->informatie[j-i] = s[j];
                    j++;
                }
            }

            s1[capat1]->informatie[j-i] = '\n';
            i = j - 1;
        }
        else if(s[i] == '(')
        {
            s2[++capat2] = (struct Nod*) (malloc(sizeof(struct Nod)));
            s2[capat2]->informatie = new char[2], s2[capat2]->st = nullptr, s2[capat2]->dr = nullptr;
            s2[capat2]->informatie[0] = '(', s2[capat2]->informatie[1] = '\n';
        }
        else if(s[i] == ')')
        {
            while(s2[capat2]->informatie[0] != '(')
            {
                capat1--;
                s2[capat2]->st = s1[capat1], s2[capat2]->dr = s1[capat1+1];
                s1[capat1] = s2[capat2];
                capat2--;
            }
            capat2--;
        }
        else
        {
            while(capat2 != -1 && s2[capat2]->informatie[0] != '(' && Prioritate(s2[capat2]->informatie[0]) >= Prioritate(s[i]))
            {
                capat1--;
                s2[capat2]->st = s1[capat1], s2[capat2]->dr = s1[capat1+1];
                s1[capat1] = s2[capat2];
                capat2--;
            }
            s2[++capat2] = (struct Nod*) (malloc(sizeof(struct Nod)));
            s2[capat2]->informatie = new char[2], s2[capat2]->st = nullptr, s2[capat2]->dr = nullptr;
            s2[capat2]->informatie[0] = s[i], s2[capat2]->informatie[1] = '\n';
        }
    }

    while(capat2 != -1)
    {
        capat1--;
        s2[capat2]->st = s1[capat1], s2[capat2]->dr = s1[capat1+1];
        s1[capat1] = s2[capat2];
        capat2--;
    }

    return s1[capat1];
}

int Eval(struct Nod* rad)
{
    if(strcmp(rad->informatie, "+\n") == 0) return Eval(rad->st) + Eval(rad->dr);
    else if(strcmp(rad->informatie, "-\n") == 0) return Eval(rad->st) - Eval(rad->dr);
    else if(strcmp(rad->informatie, "*\n") == 0) return Eval(rad->st) * Eval(rad->dr);
    else if(strcmp(rad->informatie, "/\n") == 0) return Eval(rad->st) / Eval(rad->dr);

    return atoi(rad->informatie);
}

int main()
{
    char*s = new char[100005];
    fin.getline(s, 100005);
    struct Nod* Radacina = ConstruiesteArbore(s);
    fout << Eval(Radacina);

    return 0;
}

/*
70*(1071/(9291110/1696+276875)*4059+1106990)
77489300
*/