Cod sursa(job #677493)

Utilizator gegeadDragos Gegea gegead Data 10 februarie 2012 11:53:52
Problema Evaluarea unei expresii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include<cstdio>
#include<cstring>
#include<cctype>
int op[100001],pol[100001],v[100001];
char s[100001];



int main()
{
	freopen("evaluare.in","r",stdin);
	freopen("evaluare.out","w",stdout);
	int n,i,k,j,nr,p,q,u,x;
	gets(s);
	n=strlen(s);
	k=0;
	for(i=0;i<n;++i)
		if(s[i]=='+')
			v[++k]=1000000001;
		else
			if(s[i]=='*')
				v[++k]=1000000002;
			else
				if(s[i]=='-')
					v[++k]=1000000003;
				else
					if(s[i]=='/')
						v[++k]=1000000004;
					else
						if(s[i]=='(')
							v[++k]=1000000005;
						else
							if(s[i]==')')
								v[++k]=1000000006;
							else
							{
								nr=0;
								while(isdigit(s[i]))
								{
									nr=nr*10+(s[i]-'0');
									++i;
								}
								--i;
								v[++k]=nr;
							}
	p=q=0;
	for(i=1;i<=k;++i)
	{
		x=v[i];
		if(x<=1000000000)
			pol[++q]=x;
		else
		{
			op[++p]=x;
			break;
		}
	}
	for(j=i+1;j<=k;++j)
	{
		x=v[j];
		if(x<=1000000000)
			pol[++q]=x;
		else
			if((x==1000000001&&op[p]==1000000003)||(x==1000000003&&op[p]==1000000001)||(x==1000000002&&op[p]==1000000004)||(x==1000000004&&op[p]==1000000002)||((x==1000000003||x==1000000001)&&(op[p]==1000000002||op[p]==1000000004)))
			{
				while((x==1000000001&&op[p]==1000000003)||(x==1000000003&&op[p]==1000000001)||(x==1000000002&&op[p]==1000000004)||(x==1000000004&&op[p]==1000000002)||((x==1000000001||x==1000000003)&&(op[p]==1000000004||op[p]==1000000002)))
				{
					pol[++q]=op[p];
					op[p]=0;
					--p;
				}
				op[++p]=x;
			}
			else
				if(x==1000000006)
				{
					for(u=p;op[u]!=1000000005;--u)
					{
						pol[++q]=op[u];
						op[u]=0;
						--p;
					}
					op[p]=0;
					--p;
				}
				else
					op[++p]=x;
	}
	for(i=p;i>=1;--i)
		pol[++q]=op[i];
	for(i=1;i<=q;++i)
		if(pol[i]>1000000000)
		{
			if(pol[i]==1000000001)
				pol[i-2]+=pol[i-1];
			else
				if(pol[i]==1000000002)
					pol[i-2]*=pol[i-1];
				else
					if(pol[i]==1000000003)
						pol[i-2]-=pol[i-1];
					else
						pol[i-2]/=pol[i-1];
			for(j=i-1;j<q-1;++j)
				pol[j]=pol[j+2];
			pol[q]=pol[q-1]=0;
			q-=2;
			i-=2;
		}				
	printf("%d",pol[1]);
	return 0;
}