Cod sursa(job #1820967)

Utilizator kiwiIonescu Maria kiwi Data 2 decembrie 2016 13:40:49
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<fstream>
#include<string.h>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
long long operatie(long x, long y, char c) {
    switch ( c ) {
        case '+': return x+y;
        case '-': return x-y;
        case '*': return x*y;
        case '/': return x/y;
    }
    return 0;
}
long long stack[200100],n,i,k,ts,t,gp[200];
char s[200100],exp[200100],sts[200100];
int main ()
{
    gp[')'] = 10;
    gp['+'] = gp['-'] = 15;
    gp['*'] = gp['/'] = 16;
    gp['('] = 20;
    s[0]='(';
    f>>(s+1);
    n=strlen(s);
    s[n]=')';
    for(i=0;i<=n;++i)
    {
        if(s[i]=='(')
            sts[++ts]='(';
            else
            if(s[i]>='0'&&s[i]<='9')
            {
                while(s[i]>='0'&&s[i]<='9')
                {
                    exp[++t]=s[i];
                    i++;
                }
                ++t;
                exp[t]=',';
                i--;
            }
            else
            {
                for(k=ts;k&&sts[k]!='('&&gp[sts[k]]>=gp[s[i]];--k)
                exp[++t]=sts[k];
                ts=k;
                if(s[i]!=')')
                {
                    sts[++ts]=s[i];
                }
                else
                    --ts;
            }
    }
    for(i=1;i<=t;++i)
    {
        if(exp[i]>='0'&&exp[i]<='9')
        {
            ++ts;
            stack[ts]=0;
            while(exp[i]>='0'&&exp[i]<='9')
            {
                stack[ts]=stack[ts]*10+exp[i]-48;
                ++i;
            }
        }
        else
        {
            stack[ts-1]=operatie(stack[ts-1],stack[ts],exp[i]);
            --ts;
        }
    }
    g<<stack[1];
    return 0;
}