Cod sursa(job #193374)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 3 iunie 2008 23:06:34
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <cstdio>
#include <string>
#define IN "evaluare.in"
#define OUT "evaluare.out"
#define L_MAX 110000

using namespace std;
char sir[L_MAX];
int last[L_MAX],rez[L_MAX],p,l,nrp;

void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	gets(sir);
	l=strlen(sir);
}
inline int calc(int y)
{
	int  semn;
	while(sir[p]=='*' || sir[p]=='/')
	{
		if(sir[p]=='*')
			semn=1;
		else
			semn=2;
		int x=0;
		++p;
		while(sir[p]<='9' && sir[p]>='0' && p<l)
		{
			x=x*10+sir[p]-'0';
			++p;
		}
		if(semn==1)
			y*=x;
		else
			y/=x;
	}
	return y;
}	
	
void read_nr()
{
	int x=0;
	while(sir[p]<='9' && sir[p]>='0' && p<l)
	{
		x=x*10+sir[p]-'0';
		++p;
	}
	if(sir[p]=='*' || sir[p]=='/')
		x=calc(x);
	if(last[nrp]==1)
		rez[nrp]=rez[nrp]+x;
	if(last[nrp]==2)
		rez[nrp]=rez[nrp]-x;
	if(last[nrp]==3)
		rez[nrp]=rez[nrp]*x;
	if(last[nrp]==4)
		rez[nrp]=rez[nrp]/x;
	if(last[nrp]==0)
		rez[nrp]=x;
}

void solve()
{
	for(p=0;p<l;++p)
	{
		if(sir[p]<='9' && sir[p]>='0')
			read_nr();
		if(sir[p]=='(' )
			++nrp;
		if(sir[p]==')')
		{
			--nrp;
			if(last[nrp]==1)
				rez[nrp]=rez[nrp]+rez[nrp+1];
			if(last[nrp]==2)
				rez[nrp]=rez[nrp]-rez[nrp+1];
			if(last[nrp]==3)
				rez[nrp]=rez[nrp]*rez[nrp+1];
			if(last[nrp]==4)
				rez[nrp]=rez[nrp]/rez[nrp+1];
			if(last[nrp]==0)
				rez[nrp]=rez[nrp+1];
		}
		if(sir[p]=='+')
			last[nrp]=1;
		else
			if(sir[p]=='-')
				last[nrp]=2;
			else
				if(sir[p]=='*')
					last[nrp]=3;
				else
					if(sir[p]=='/')
						last[nrp]=4;
					else
						last[nrp]=0;
	}	
	printf("%d\n", rez[nrp]);
}

int main()
{
	scan();
	solve();
	return 0;
}