Cod sursa(job #872988)

Utilizator Kira96Denis Mita Kira96 Data 6 februarie 2013 19:46:20
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 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[ts]]>=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;
}