Cod sursa(job #326907)

Utilizator crisojogcristian ojog crisojog Data 26 iunie 2009 16:42:44
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.52 kb
#include<stdio.h>  
#include<string.h> 
#include<ctype.h>
#include<stdlib.h>
char s[100010],polo[100010][12],op[100010];
long st[100010];
long i,j,l,t;
long a,b,c,temp[12],max=polo[0][1];
int prior(char a)
{
	if(a=='+' || a=='-') return 1;
	return 2;
}

void polonia()
{
	t=-1;
	for(i=0;i<l;++i)
	{ 
		if(isdigit(s[i]))
		{
			max++;
			polo[max][++t]=s[i];
			while(isdigit(s[i+1]))
			{
				i++;
				polo[max][++t]=s[i];
			}
			t=-1;
		}
		else
		{
			if(!op[0] || s[i]=='(')
			{
				++op[0];
				op[op[0]]=s[i];
			}
			else 
			{			
				if(s[i]==')')
				{
					while(op[op[0]]!='(')
					{
						polo[++max][0]=op[op[0]];
						op[0]--;
					}
					op[0]--;
				}
				else
				{
					if(prior(op[op[0]])<prior(s[i]) || op[op[0]]=='(')
					{
						op[++op[0]]=s[i];
					}
					else
					{
						while(op[0] && op[op[0]]!='(')
						{
							polo[++max][0]=op[op[0]];
							op[0]--;
						}
						op[++op[0]]=s[i];
					}
				}
			}
		}
	}
	while(op[0])
	{
		polo[++max][0]=op[op[0]];
		op[0]--;
	}
}

void evaluare()
{	
	long k=0;
	for(i=1;i<=max;++i)
	{
		++k;
		if(isdigit(polo[i][0]))
		{
			st[k]=atol(polo[i]);
		}
		else
		{
			if(polo[i][0]=='+')
			{
				k-=1;
				st[k]=st[k]+st[k+1];
			}
			else
				if(polo[i][0]=='-') 
				{
					k-=1;
					st[k]=st[k]-st[k+1];
				}
				else
					if(polo[i][0]=='*') 
					{
						k-=2;
						st[k]=st[k]*st[k+1];
					}
					else
						if(polo[i][0]=='/') 
						{
							k-=1;
							st[k]=st[k]/st[k+1];
						}
		}
		
	}
	
	
	/*for(i=1;i<=max;++i)
	{
		if(isdigit(polo[i][1]))
		{
			for(j=1;j<=polo[i][0];++j)
				ps[i]=ps[i]*10+(polo[i][j]-'0');
		}
		else
		{
			if(polo[i][1]=='+') ps[i]=1000000001;
			if(polo[i][1]=='-') ps[i]=1000000002;
			if(polo[i][1]=='*') ps[i]=1000000003;
			if(polo[i][1]=='/') ps[i]=1000000004;
		}
	}
	while(max>1)
	{
		for(i=1;i<=max;++i)
		{
			if(ps[i]>=1000000001)
			{	
				a=ps[i-2];b=ps[i-1];
				if(ps[i]==1000000001) c=a+b;
					else 
						if(ps[i]==1000000002) c=a-b;
							else 
								if(ps[i]==1000000003) c=a*b;
									else 
										if(ps[i]==1000000004) c=a/b;
				memset(temp,0,sizeof(temp));
				ps[i-2]=c;
				for(j=i-1;j<=max-2;++j)
				{
					ps[j]=ps[j+2];
				}
				max-=2;
				break;
			}
		}
	}*/
}

int main()
{
	freopen("evaluare.in","r",stdin);
	freopen("evaluare.out","w",stdout);
	gets(s);
	l=strlen(s);
	polonia();
	evaluare();
	printf("%ld",st[1]);
	printf("\n");
	return 0;
}