Cod sursa(job #579828)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 12 aprilie 2011 15:05:09
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<stdio.h>
#include<string.h>
char s[100050];
long st[100050],aux[100050],n,x[100050],lx,la,l,i;
int main()
{
	freopen("evaluare.in","r",stdin);
	freopen("evaluare.out","w",stdout);
	gets(s+1);
	s[0]=1;
	n=strlen(s);
	for(i=1;i<=n;++i)
	{
		if(s[i]<='9'&&s[i]>='0')
			if(s[i-1]<='9'&&s[i-1]>='0')if(st[l]>0)st[l]=st[l]*10+s[i]-'0';
										else st[l]=st[l]*10-s[i]+'0';
		else
		    if(s[i-1]=='-'&&(s[i-2]=='('||i-2==0)){--la;st[++l]=-(s[i]-'0');}
		else st[++l]=s[i]-'0';
		if(s[i]=='(')aux[++la]=-1000000010;
		if(s[i]=='*'){while(aux[la]==-1000000003||aux[la]==-1000000004){st[++l]=aux[la--];}aux[++la]=-1000000004;}
		if(s[i]=='/'){while(aux[la]==-1000000003||aux[la]==-1000000004){st[++l]=aux[la--];}aux[++la]=-1000000003;}
		if(s[i]=='+'){while(aux[la]>=-1000000004&&aux[la]<=-1000000001){st[++l]=aux[la--];}aux[++la]=-1000000002;}
		if(s[i]=='-'){while(aux[la]>=-1000000004&&aux[la]<=-1000000001){st[++l]=aux[la--];}aux[++la]=-1000000001;}
		if(s[i]==')'){while(aux[la]!=-1000000010){st[++l]=aux[la--];}--la;}
	}
	while(la>0){st[++l]=aux[la--];}
	x[1]=st[1];
	lx=1;
	for(i=2;i<=l;++i)
		if(st[i]>-1000000000)x[++lx]=st[i];
		else 
		if(st[i]==-1000000004)x[lx-1]*=x[lx--];
		else
		if(st[i]==-1000000003)x[lx-1]/=x[lx--];
		else
		if(st[i]==-1000000002)x[lx-1]+=x[lx--];
		else
		if(st[i]==-1000000001)x[lx-1]-=x[lx--];
	printf("%ld\n",x[1]);
	return 0;
}