Cod sursa(job #196249)

Utilizator DraStiKDragos Oprica DraStiK Data 24 iunie 2008 23:45:01
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <stdio.h>
#include <string.h>
char s[100005],oper[100005],polon[100005];
int n,u,v;
int sol[100005];
void poloneza ()
{
	int i;
	gets(s);
	n=strlen (s);
	for (i=0; i<n; ++i)
	   if (s[i]>='0' && s[i]<='9')
		   polon[++u]=s[i];
	   else if (s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/' || s[i]=='(' || s[i]==')')
	   {
			if (v==0)
				oper[++v]=s[i];
            else 
            {
				if ((s[i]=='+' || s[i]=='-') && (oper[v]=='*' || oper[v]=='/'))
				{
					while (oper[v]=='*' || oper[v]=='/')
						polon[++u]=oper[v--];
					oper[++v]=s[i];
				}
				else if (s[i]==')')
				{
					while (oper[v]!='(')
						polon[++u]=oper[v--];
					--v;
				}
                else
                    oper[++v]=s[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];
}
void calculeaza ()
{
    int i,j;
    for (i=1; i<=u; ++i)
        if (polon[i]!='+' && polon[i]!='-' && polon[i]!='*' && polon[i]!='/')    
			sol[i]=polon[i]-'0';
	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];
				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;    
}