Cod sursa(job #1997985)

Utilizator CammieCamelia Lazar Cammie Data 5 iulie 2017 23:59:50
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 3.01 kb
#include <fstream>

#define MAXN 100012

using namespace std;

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

int ps, pi, vf, stiva[MAXN], nr;

struct punct{
    int val, tip;
};

punct coada[MAXN];

inline void Initializer(void)
{
    ps = 1; pi = 0; vf = 0;
}

inline bool EsteCifra(char c)
{
    if (c >= '0' && c <= '9')
        return true;
    return false;
}

inline void SetPostfix(void)
{
    char chr;

    fin >> chr;

    while (!fin.eof())
    {
        if (chr == '(')
        {
            stiva[++vf] = chr;
            fin >> chr;
        }
        else if (EsteCifra(chr))
        {
            nr = 0;

            while (EsteCifra(chr) && !fin.eof())
            {
                nr *= 10;
                nr += (chr - '0');

                fin >> chr;
            }

            coada[++pi].val = nr;
            coada[pi].tip = -1; /// -1 = intreg; 1 = char
        }
        else if (chr == ')')
        {
            while (stiva[vf] != '(' && vf > 0)
            {
                coada[++pi].val = stiva[vf];
                coada[pi].tip = 1;
                vf--;
            }
            vf--; ///elimin '('
            fin >> chr;
        }
        else
        {
            if (chr == '+' || chr == '-')
            {
                while (stiva[vf] != '(' && vf > 0)
                {
                    coada[++pi].val = stiva[vf];
                    coada[pi].tip = 1;
                    vf--;
                }
                stiva[++vf] = chr;
                fin >> chr;
            }
            else
            {
                while (stiva[vf] == '*' && stiva[vf] == '/' && vf > 0)
                {
                    coada[++pi].val = stiva[vf];
                    coada[pi].tip = 1;
                    vf--;
                }
                stiva[++vf] = chr;
                fin >> chr;
            }
        }
    }

    while (vf > 0)
    {
        coada[++pi].val = stiva[vf];
        coada[pi].tip = 1;
        vf--;
    }
}

inline void Evaluate(void)
{
    while (ps <= pi)
    {
        if (coada[ps].tip == -1) ///e intreg
        {
            stiva[++vf] = coada[ps].val;
        }
        else
        {
            if (coada[ps].val == '+')
            {
                stiva[vf - 1] = stiva[vf - 1] + stiva[vf];
                vf--;
            }
            else if (coada[ps].val == '-')
            {
                stiva[vf - 1] = stiva[vf - 1] - stiva[vf];
                vf--;
            }
            else if (coada[ps].val == '*')
            {
                stiva[vf - 1] = stiva[vf - 1] * stiva[vf];
                vf--;
            }
            else
            {
                stiva[vf - 1] = stiva[vf - 1] / stiva[vf];
                vf--;
            }
        }
        ps++;
    }

    fout << stiva[vf];
}

int main ()
{
    Initializer();
    SetPostfix();
    Evaluate();

    fin.close(); fout.close(); return 0;
}