Cod sursa(job #1871293)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 7 februarie 2017 11:30:54
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include <fstream>
#include <cstring>
#define Nmax 100002
using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

int n,st[Nmax],nr;
bool sgn[Nmax];
char s[Nmax];

void calc(int st[],bool sgn[],int &nr)
{
    int aux[Nmax],lg=0;
    bool sgn2[Nmax];
    while ((sgn[nr]!=1 || st[nr]!=5) && nr>=1)
    {
        aux[++lg] = st[nr];
        sgn2[lg] = sgn[nr];
        nr--;
    }
    while (lg>=1)
    {
        if (sgn2[lg]==1 && aux[lg]==3)
            st[nr] *= aux[--lg];

        else if (sgn2[lg]==1 && aux[lg]==4)
            st[nr] /= aux[--lg];

        else
        {
            st[++nr] = aux[lg];
            sgn[nr] = sgn2[lg];
        }
        lg--;
    }


    while ((sgn[nr]!=1 || st[nr]!=5) && nr>=1)
    {
        aux[++lg] = st[nr];
        sgn2[lg] = sgn[nr];
        nr--;
    }
    if (nr>=1)
        nr--;

    while (lg>=1)
    {
        if (sgn2[lg]==1 && aux[lg]==1)
            st[nr] += aux[--lg];

        else if (sgn2[lg]==1 && aux[lg]==2)
            st[nr] -= aux[--lg];

        else
        {
            st[++nr] = aux[lg];
            sgn[nr] = sgn2[lg];
        }

        lg--;
    }
}
int main()
{
    f>>s;
    int n = strlen(s);
    for (int i=0;i<n;i++)
    {
        if (s[i]>='0' && s[i]<='9')
        {
            int x = 0;
            while (s[i]>='0' && s[i]<='9')
            {
                x = x * 10 + s[i] - '0';
                i++;
            }

            st[++nr] = x;
            sgn[nr] = 0;
            i--;
        }
        else if (s[i]=='+')
        {
            st[++nr] = 1;
            sgn[nr] = 1;
        }
        else if (s[i]=='-')
        {
            st[++nr] = 2;
            sgn[nr] = 1;
        }
        else if (s[i]=='*')
        {
            st[++nr] = 3;
            sgn[nr] = 1;
        }
        else if (s[i]=='/')
        {
            st[++nr] = 4;
            sgn[nr] = 1;
        }
        else if (s[i]=='(')
        {
            st[++nr] = 5;
            sgn[nr] = 1;
        }
        else if (s[i]==')')
        {
            calc(st,sgn,nr);
        }
    }
    calc(st,sgn,nr);

    g<<st[1]<<'\n';

    return 0;
}