Cod sursa(job #677428)

Utilizator gegeadDragos Gegea gegead Data 10 februarie 2012 10:42:46
Problema Evaluarea unei expresii Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 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]=-1;
		else
			if(s[i]=='*')
				v[++k]=-2;
			else
				if(s[i]=='-')
					v[++k]=-3;
				else
					if(s[i]=='/')
						v[++k]=-4;
					else
						if(s[i]=='(')
							v[++k]=-5;
						else
							if(s[i]==')')
								v[++k]=-6;
							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>0)
			pol[++q]=x;
		else
		{
			op[++p]=x;
			break;
		}
	}
	for(j=i+1;j<=k;++j)
	{
		x=v[j];
		if(x>0)
			pol[++q]=x;
		else
			if((x==-1&&op[p]==-3)||(x==-3&&op[p]==-1)||(x==-2&&op[p]==-4)||(x==-4&&op[p]==-2)||((x==-3||x==-1)&&(op[p]==-2||op[p]==-4)))
			{
				while((x==-1&&op[p]==-3)||(x==-3&&op[p]==-1)||(x==-2&&op[p]==-4)||(x==-4&&op[p]==-2)||((x==-1||x==-3)&&(op[p]==-4||op[p]==-2)))
				{
					pol[++q]=op[p];
					op[p]=0;
					--p;
				}
				op[++p]=x;
			}
			else
				if(x==-6)
				{
					for(u=p;op[u]!=-5;--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]<0)
		{
			if(pol[i]==-1)
				pol[i-2]+=pol[i-1];
			else
				if(pol[i]==-2)
					pol[i-2]*=pol[i-1];
				else
					if(pol[i]==-3)
						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];
			q-=2;
			i-=2;
		}				
	printf("%d",pol[1]);
	return 0;
}