Cod sursa(job #894714)

Utilizator andreea29Iorga Andreea andreea29 Data 26 februarie 2013 23:07:09
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 4.28 kb
#include<fstream>
#include<cstring>

#define Nmax 100010
#define INFI 10000000

using namespace std;

int n, i, nr, p[Nmax], m, s[Nmax], sf, c[Nmax], val;
char d[Nmax];

void expresie ();
void factor ();
void termen ();
void exp_plus();
void exp_minus();
void term_ori();
void term_cat();

int main()
{
    ifstream f("evaluare.in");
    ofstream h("evaluare.out");
    f.getline(d, Nmax);
    m = strlen(d) - 1;
    i = 0;
    n = 0;
    while (i <= m)
    {
        if (d[i] == '*')
        {
            s[n] = (- INFI - 4);
            ++i;
            ++n;
        }
        else
            if (d[i] == '/')
            {
                s[n] = (- INFI - 3);
                ++i;
                ++n;
            }
            else
                if (d[i] == '+')
                {
                    s[n] = (- INFI - 2);
                    ++i;
                    ++n;
                }
                else
                    if (d[i] == '-')
                    {
                        s[n] = (- INFI - 1);
                        ++i;
                        ++n;
                    }
                    else
                        if (d[i] == '(' || d[i] == ')')
                        {
                            s[n] = (- INFI);
                            ++i;
                            ++n;
                        }
                        else
                        {
                            nr = int (d[i]) - 48;
                            ++i;
                            while (d[i] >= '0' && d[i] <= '9')
                            {
                                nr *= 10;
                                nr += (int(d[i]) - 48);
                                ++i;
                            }
                            s[n] = nr;
                            ++n;
                        }
    }
    nr = 0;
    i = 0;
    expresie();
    i = 0;
    sf = 0;
    while (i < nr)
    {
        if (p[i] > -INFI)
        {
            c[sf] = p[i];
            ++sf;
        }
        else
            if (p[i] == -INFI - 2)
            {
                val = c[sf - 2] + c[sf - 1];
                sf -= 2;
                c[sf] = val;
                ++sf;
            }
            else
                if (p[i] == -INFI - 1)
                {
                    val = c[sf - 2] - c[sf - 1];
                    sf -= 2;
                    c[sf] = val;
                    ++sf;
                }
                else
                    if (p[i] == -INFI - 4)
                    {
                        val = c[sf - 2] * c[sf - 1];
                        sf -= 2;
                        c[sf] = val;
                        ++sf;
                    }
                    else
                    {
                        val = c[sf - 2] / c[sf - 1];
                        sf -= 2;
                        c[sf] = val;
                        ++sf;
                    }
        ++i;
    }
    h << c[0] << '\n';
}

void expresie ()
{
    termen ();
    if (s[i] == (- INFI - 2))
        exp_plus();
    else
        if (s[i] == (- INFI - 1))
            exp_minus();
}

void exp_plus ()
{
    while (i < n && s[i] == (- INFI - 2))
    {
        ++i;
        termen();
        p[nr] = (- INFI - 2);
        ++nr;
        //p[nr] = ;
    }
}

void exp_minus ()
{
    while (i < n && s[i] == (- INFI - 1))
    {
        ++i;
        termen();
        p[nr] = (- INFI - 1);
        ++nr;
        //p[nr] = 45;
    }
}

void termen ()
{
    factor();
    if (s[i] == (- INFI - 4))
        term_ori();
    else
        if (s[i] == (- INFI - 3))
            term_cat();
}

void term_ori()
{
    while (i < n && s[i] == (- INFI - 4))
    {
        ++i;
        factor();
        p[nr] = (- INFI - 4);
        ++nr;
        //p[nr] = 42;
    }
}

void term_cat ()
{
    while (i < n && s[i] == (- INFI - 3))
    {
        ++i;
        factor();
        p[nr] = (- INFI - 3);
        ++nr;
        //p[nr] = 47;
    }
}

void factor ()
{
    if (s[i] == (- INFI))
    {
        ++i;
        expresie();
        ++i;
    }
    else
    {
        p[nr] = s[i];
        //p[nr] = int (s[i]);
        ++nr;
        ++i;
    }
}