Cod sursa(job #197057)

Utilizator DraStiKDragos Oprica DraStiK Data 1 iulie 2008 10:29:08
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <stdio.h>
#include <string.h>

#define dim 105

char s[dim],s2[dim];
char oper[dim],polon[dim];
int polon2[dim],s3[dim];
int n,u,v,m;
int sol[dim];
void poloneza ()
{
	int i,nr;
	
	gets(s);
	n=strlen (s);
	
	for (i=0; i<dim; ++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];
}
void calculeaza ()
{
	int i,j, k ;
	for (i=1, k = 0; i<=u; ++i)
		if (polon[i]!='+' && polon[i]!='-' && polon[i]!='*' && polon[i]!='/')
			sol[++k]=polon2[i];
		else
		{	sol[k-1]=calcul(polon[i],k+1);
			--k;
		}

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