Cod sursa(job #2789402)

Utilizator stefandutastefandutahoria stefanduta Data 27 octombrie 2021 15:09:02
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.44 kb
#include <fstream>
#include <cstring>
#define NMAX 100005
using namespace std;
ifstream in ("evaluare.in");
ofstream out ("evaluare.out");
char s[NMAX];
int i;

int factori[NMAX];
int nrfactori;

char operatori[NMAX];
int nroperatori;

bool isdigit(char x)
{
    return x >= '0' && x <= '9';
}

int prioritate (char x)
{
    if (x == '+' || x == '-')
        return 1;
    if (x == '*' || x == '/')
        return 2;
    return 0;
}

void pushfactor (int x)
{
    factori[nrfactori] = x;
    nrfactori++;
}

void pushoperator (char x)
{
    if (x == '+' || x == '-' || x == '*' || x == '/' || x == '(' || x == ')')
    {
        operatori[nroperatori] = x;
        nroperatori++;
    }
}

int poplastfactor ()
{
    if (nrfactori)
    {
        nrfactori--;
        return factori[nrfactori];
    }
    return 0;
}

char poplastoperator ()
{
    if (nroperatori)
    {
        nroperatori--;
        return operatori[nroperatori];
    }
    return '\0';
}

char lastoperator ()
{
    if (nroperatori)
        return operatori[nroperatori-1];
    return '\0';
}

int factor ()
{
    int nr = 0;
    while (isdigit(s[i]))
    {
        nr = nr * 10 + s[i] - '0';
        ++i;
    }
    return nr;
}

int calculeaza (int a, int b, char op)
{
    if (op == '+')
        return a + b;
    else if (op == '-')
        return a - b;
    else if (op == '*')
        return a * b;
    else if (op == '/')
        return a / b;
}

int combina ()
{
    int b = poplastfactor();
    int a = poplastfactor();
    pushfactor(calculeaza(a, b, poplastoperator()));
}

int main()
{
    in.getline(s, NMAX);
    int n;
    n=strlen(s);

    i = 0;
    while(i < n)
    {
        if (isdigit(s[i]))
            pushfactor(factor());
        else if (s[i] == '(')
        {
            pushoperator('(');
            ++i;
        }
        else if (s[i] == ')')
        {
            while (lastoperator() != '(')
            {
                combina();
            }
            poplastoperator();
            ++i;
        }
        else if (prioritate(s[i]))
        {
            while (prioritate(lastoperator()) && prioritate(lastoperator()) >= prioritate(s[i]))
                combina();
            pushoperator(s[i]);
            ++i;
        }
        else
            ++i;
    }
    while(nroperatori > 0)
        combina();
    out << poplastfactor();
    return 0;
}