Cod sursa(job #2531989)

Utilizator niculaandreiNicula Andrei Bogdan niculaandrei Data 26 ianuarie 2020 23:33:41
Problema Evaluarea unei expresii Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.33 kb
#include <bits/stdc++.h>
#define N_MAX 100005

using namespace std;

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

struct node
{
    string info;
    node *le, *ri;
};

node *root = NULL;

string E;
string atomi[N_MAX];
int n, idx = 1;

void Atomizare()
{
    for (int i = 0; E[i]; i++)
    {
        int j = i;
        while ('0' <= E[j] && E[j] <= '9')
            j++;
        atomi[++n] = E.substr(i, j - i + (i == j));
        i = j - (i != j);
    }
}

node *Factor();
node *Termen();
node *Expresie();

node *Factor()
{
    if (atomi[idx] == "(")
    {
        idx++;
        node *p = Expresie();
        idx++;
        return p;
    }
    else
        return new node{atomi[idx++], NULL, NULL};
}

node *Termen()
{
    node *newNode = new node;
    newNode = Factor();
    if (atomi[idx] == "*" || atomi[idx] == "/")
        return new node{atomi[idx++], newNode, Termen()};
    else return newNode;
}

node *Expresie()
{
    node *newNode = new node;
    if (atomi[idx] == "+")
    {
        idx++;
        newNode = Termen();
    }
    else if (atomi[idx] == "-")
    {
        idx++;
        newNode = Termen();
        newNode->info = '-' + newNode->info;
    }
    else
        newNode = Termen();
    if (atomi[idx] == "+" || atomi[idx] == "-")
    {
        node *aux = new node{atomi[idx++], newNode, Expresie()};
        return aux;
    }
    return newNode;
}

int Convert(string s)
{
    int ret = 0;
    if (s[0] == '+')
        return Convert(s.substr(1));
    else if (s[0] == '-')
        return -Convert(s.substr(1));
    for (int i = 0; i < s.size(); i++)
        ret = ret * 10 + s[i] - '0';
    return ret;
}

int Evaluare(node *currNode)
{
    if (currNode->info == "+")
        return Evaluare(currNode->le) + Evaluare(currNode->ri);
    else if (currNode->info == "-")
        return Evaluare(currNode->le) - Evaluare(currNode->ri);
    else if (currNode->info == "*")
        return Evaluare(currNode->le) * Evaluare(currNode->ri);
    else if (currNode->info == "/")
        return Evaluare(currNode->le) / Evaluare(currNode->ri);
    else
        return Convert(currNode->info);
}

int main()
{
    fin >> E;
    E = '(' + E + ')';

    Atomizare();

    root = Factor();

    fout << Evaluare(root);
    return 0;
}