Cod sursa(job #872944)

Utilizator Kira96Denis Mita Kira96 Data 6 februarie 2013 19:13:47
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include<fstream>
#include<string.h>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
int gr(char t)
{
    if(t=='*'||t=='/')
    return 1;
    else
    if(t=='+'||t=='-')
    return 0;
    return -1;
}
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;
}
int stack[200100],n,i,k,ts,t;
char s[200100],exp[200100],sts[200100];
int main ()
{
    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
            if(s[i]==')')
            {
                for(k=ts;sts[k]!='(';--k)
                exp[++t]=sts[k];
                ts=k-1;
            }
            else
            {
                if(gr(s[i])<=gr(sts[ts]))
                {
                    exp[++t]=sts[ts];
                    sts[ts]=s[i];
                }
                else
                sts[++ts]=s[i];
            }
    }
    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;
}