Cod sursa(job #2188552)

Utilizator tigeraOprea Tereza Emilia tigera Data 27 martie 2018 11:06:42
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.63 kb
#include <bits/stdc++.h>
#define MAXX 1000000000

using namespace std;

ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
string s;
int n, pl = MAXX + 1, mi = MAXX + 2, i;
int ori = MAXX + 3, di = MAXX + 4, pd = MAXX + 5, pi = MAXX + 6;
int st[100010], ls;
int fp[100010], lfp;
int x, a, b;
stack <int>q;

int main ()
{
    fin >> s;
    n = s.size();
    i = 0;
    while (i < n)
    {
        if (s[i]  <= '9' && s[i] >= '0')
        {
            x = 0;
            while (s[i]  <= '9' && s[i] >= '0')
            {
                x = x*10 + s[i] - '0';
                i++;
            }
            fp[++lfp] = x;
        }
        else if (s[i] == '(')
        {
            st[++ls] = pd;
            i++;
        }
        else if (s[i] == '*')
        {
            if (st[ls] == ori || st[ls] == di)
            {
                fp[++lfp] = st[ls];
                st[ls] = ori;
            }
            else if (st[ls] == pl || st[ls] == mi || st[ls] == pd || ls == 0)
                st[++ls] = ori;
            i++;
        }
        else if (s[i] == '/')
        {
            if (st[ls] == ori || st[ls] == di)
            {
                fp[++lfp] = st[ls];
                st[ls] = di;
            }
            else if (st[ls] == pl || st[ls] == mi || st[ls] == pd || ls == 0)
                st[++ls] = di;
            i++;
        }
        else if (s[i] == '+')
        {
            if (st[ls] == pl || st[ls] == mi)
            {
                fp[++lfp] = st[ls];
                st[ls] = pl;
            }
            else if (st[ls] == di || st[ls] == ori)
            {
                fp[++lfp] = st[ls];
                ls--;
                if (st[ls] == mi || st[ls] == pl)
                {
                    fp[++lfp] = st[ls];
                    st[ls] = pl;
                }
                else
                    st[++ls] = pl;
            }
            else if (st[ls] == pd || ls == 0)
                st[++ls] = pl;
            i++;
        }
        else if (s[i] == '-')
        {
            if (st[ls] == pl || st[ls] == mi)
            {
                fp[++lfp] = st[ls];
                st[ls] = mi;
            }
            else if (st[ls] == di || st[ls] == ori)
            {
                fp[++lfp] = st[ls];
                ls--;
                if (st[ls] == mi || st[ls] == pl)
                {
                    fp[++lfp] = st[ls];
                    st[ls] = mi;
                }
                else
                    st[++ls] = mi;
            }
            else if (st[ls] == pd || ls == 0)
                st[++ls] = mi;
            i++;
        }
        else if (s[i] == ')')
        {
            while (st[ls]!=pd)
            {
                fp[++lfp] = st[ls];
                ls--;
            }
            ls--;
            i++;
        }
    }
    while (ls > 0)
    {
        fp[++lfp] = st[ls];
        ls--;
    }
   for (i=1; i<=lfp; i++)
   {
       if (fp[i] == pl)
       {
           a = q.top(); q.pop();
           b = q.top(); q.pop();
           q.push (a+b);
       }
       else if (fp[i] == mi)
       {
           a = q.top(); q.pop();
           b = q.top(); q.pop();
           q.push (b-a);
       }
       else if (fp[i] == ori)
       {
           a = q.top(); q.pop();
           b = q.top(); q.pop();
           q.push (a*b);
       }
       else if (fp[i] == di)
       {
           a = q.top(); q.pop();
           b = q.top(); q.pop();
           q.push (b/a);
       }
       else
            q.push (fp[i]);
   }
   fout << q.top();
}