Cod sursa(job #1991186)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 15 iunie 2017 15:46:22
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 3.23 kb
#include <fstream>
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;

char c[100001];
struct Node{
    union Value {int nr; char op;};
    Value value;
    Node* left = nullptr;
    Node* right = nullptr;
};
Node* arb = nullptr;

void read()
{
    ifstream is("evaluare.in", ios::in);
    char caracter, urmator;
    int i = 0, inParanteza = 0, special = 0;
    stack<char> operatori;

    caracter = is.get();
    do
    {
        if (isdigit(caracter))
        {
            c[i++] = caracter;
            goto final;
        }
        if (caracter == '(')
        {
            ++inParanteza;
            operatori.push('(');
            goto final;
        }
        if (caracter == ')')
        {
            --inParanteza;
            caracter = operatori.top();
            operatori.pop();
            do
            {
                c[i++] = caracter;
                caracter = operatori.top();
                operatori.pop();
            } while (caracter != '(');
            if (inParanteza == 0)
                while (!operatori.empty())
                {
                    c[i++] = operatori.top();
                    operatori.pop();
                }
            goto final;
        }
        if (i && isdigit(c[i-1]))
            c[i++] = ';';
        if (caracter == '*' || caracter == '\\')
            special = 1;
        operatori.push(caracter);

        final:
        urmator = is.get();
        if (special && isdigit(caracter) && !isdigit(urmator))
        {
            c[i++] = operatori.top();
            operatori.pop();
            --special;
        }
        caracter = urmator;
    } while (!(caracter == '\n' || caracter == '\0'));
    while (!operatori.empty())
    {
        caracter = operatori.top();
        operatori.pop();
        c[i++] = caracter;
    }

    c[i] = '\0';
    //cout << c;
}

void create()
{
    int n = strlen(c), nr = 0;
    stack<Node*> noduri;

    for (int i = 0; i < n; ++i)
    {
        if (isdigit(c[i]))
        {
            nr = nr * 10 + c[i] - '0';
            continue;
        }
        if (nr)
        {
            Node* nodV = new Node;
            nodV->value.nr = nr;
            nr = 0;
            noduri.push(nodV);
            if (c[i] == ';')
                continue;
        }
        Node* nodO = new Node;
        nodO->value.op = c[i];
        nodO->right = noduri.top();
        noduri.pop();
        nodO->left = noduri.top();
        noduri.pop();
        noduri.push(nodO);
    }
    arb = noduri.top();
    noduri.pop();
}

int calculate(Node* nod)
{
    if (nod->left == nullptr)
        return nod->value.nr;
    switch (nod->value.op)
    {
    case '+':
        return calculate(nod->left) + calculate(nod->right);
    case '-':
        return calculate(nod->left) - calculate(nod->right);
    case '*':
        return calculate(nod->left) * calculate(nod->right);
    case '/':
        return calculate(nod->left) / calculate(nod->right);
    default:
        return 0;
    }
}

int main()
{
    read();
    create();
    ofstream os("evaluare.out", ios::out | ios::trunc);
    os << calculate(arb);
    os.close();
    return 0;
}