Cod sursa(job #606727)

Utilizator crisojogcristian ojog crisojog Data 9 august 2011 13:33:53
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include<stdio.h>  
#include<string.h> 
#include<ctype.h>

char s[100010],polo[100010][12],op[100010];
long st[100010];
long i,j,l,t;
long a,b,c,temp[12],max=0;
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(s[i])==2)
					{
						while(op[0] && op[op[0]]!='(' && prior(op[op[0]])!=1)
						{
							polo[++max][0]=op[op[0]];
							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,temp;
	for(i=1;i<=max;++i)
	{
		++k;
		if(isdigit(polo[i][0]))
		{
			temp=strlen(polo[i]);
			st[k]=0;
			for(j=0;j<temp;++j)
				st[k]=st[k]*10+polo[i][j]-'0';
		}
		else
		{
			if(polo[i][0]=='+')
			{
				k-=2;
				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-=2;
						st[k]=st[k]*st[k+1];
					}
					else
						if(polo[i][0]=='/') 
						{
							k-=2;
							st[k]=st[k]/st[k+1];
						}
		}
		
	}
}

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;
}