Cod sursa(job #196559)

Utilizator DraStiKDragos Oprica DraStiK Data 27 iunie 2008 09:23:08
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <stdio.h>
#include <string.h>
char s[100005],s2[100005];
char oper[1005],polon[100005];
int polon2[100005],s3[100005];
int n,u,v,m;
int sol[1005];
void poloneza ()
{
	int i,nr;
	
	gets(s);
	n=strlen (s);
	
	for (i=0; i<1005; ++i)
        s3[i]=-1;
	
	for (i=0; i<n; )
        if (s[i]>='0' && s[i]<='9')
        {
            nr=0;
            while (s[i]>='0' && s[i]<='9')
                nr=nr*10+s[i++]-'0';    
            s3[m++]=nr;
        }
        else
            s2[m++]=s[i++];
    
	for (i=0; i<m; ++i)
	   if (s3[i]!=-1)
		   polon2[++u]=s3[i];
	   else if (s2[i]=='+' || s2[i]=='-' || s2[i]=='*' || s2[i]=='/' || s2[i]=='(' || s2[i]==')')
	   {
			if (v==0)
				oper[++v]=s2[i];
            else 
            {
				if ((s2[i]=='+' || s2[i]=='-') && (oper[v]=='*' || oper[v]=='/'))
				{
					while (oper[v]=='*' || oper[v]=='/')
						polon[++u]=oper[v--];
					oper[++v]=s2[i];
				}
				else if (s2[i]==')')
				{
					while (oper[v]!='(')
						polon[++u]=oper[v--];
					--v;
				}
                else
					oper[++v]=s2[i];
            }
	   }
	   for (i=v; i; --i)
	       polon[++u]=oper[i];
}	    
int calcul (char val,int i)
{
    if (val=='+')
        return sol[i-2]+sol[i-1];
    if (val=='-')
        return sol[i-2]-sol[i-1];
    if (val=='*')
        return sol[i-2]*sol[i-1];
    if (val=='/')
		return sol[i-2]/sol[i-1];
	return 0;
}
void calculeaza ()
{
    int i,j;
    for (i=1; i<=u; ++i)
        if (polon[i]!='+' && polon[i]!='-' && polon[i]!='*' && polon[i]!='/')    
			sol[i]=polon2[i];
	for (i=1; i<=u; ++i)
		if (polon[i]=='+' || polon[i]=='-' || polon[i]=='*' || polon[i]=='/')
		{
			sol[i-2]=calcul(polon[i],i);
			for (j=i-1; j<u-1; ++j)
			{
				polon[j]=polon[j+2];
				polon2[j]=polon2[j+2];
				sol[j]=sol[j+2];
			}
			u-=2;
			i-=2;
        }
    printf ("%d",sol[1]);
}
int main ()
{
    freopen ("evaluare.in","r",stdin);
    freopen ("evaluare.out","w",stdout);
    poloneza ();
    calculeaza ();
    return 0;    
}