Cod sursa(job #503627)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 23 noiembrie 2010 22:36:25
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
# include <stdio.h>
# include <string.h>

int c[100005],k,l,n,i,nr,s[100005];
char ch,st[100005],a[100007];

 void form (int &nr)
 {
	 int x=ch-48;
	 while (scanf ("%c",&ch)!=EOF && ch>='0' && ch<='9')
	 {
		 
		 x=x*10+(ch-48);
	 }
	 
	 nr=x;
 }


 void add (char ch)
  {
	 l++;
     st[l]=ch;
 }	 


   void scoate (char ch)
   {
	   if (ch=='+')
		 {
			 k++;
     	     c[k]=-1;
	   }
	   if (ch=='-')
	   {
		   k++;
		   c[k]=-2;
	   }
	   if (ch=='*')
	   {
		   k++;
		   c[k]=-3;
	   }
	   if (ch=='/')
	   {
		   k++;
		   c[k]=-4;
	   }
	   
   }

	  
int main ()
{
	freopen("evaluare.in","r",stdin);
freopen ("evaluare.out","w",stdout);
	
	
	while (scanf ("%c",&ch)!=EOF)
	{
		
		if (ch>='0' && ch<='9')
		{
			form (nr);
			k++;
			c[k]=nr;
		}
		
			
			if (ch=='(')
				add('(');
			
			if (ch==')')
			{
				
				while (st[l]!='(')
				{
					scoate (st[l]);
					l--;
				}
				l--;
			}
			if (ch=='+' || ch=='-')
			{
				while (st[l]=='+' || st[l]=='-' || st[l]=='*' ||st[l]=='/')
				{	
					scoate (st[l]);
					l--;
				}
				add (ch);
			}
			if (ch=='*' || ch=='/')
			{	
				while (st[l]=='*' || st[l]=='/')
				{
					scoate (st[l]);
					l--;
				}
			add (ch);
			}
			
		
	}
	
	while (l>0)
	{
		scoate (st[l]);
		l--;
	}
	n=k;
	l=0;
	for (i=1;i<=n;i++)
    {
		if (c[i]>=0)
		{
			l++;
			s[l]=c[i];
		}
		else
		{
			if (c[i]==-1)
			{
				l--;
				s[l]=s[l]+s[l+1];
			}
			if (c[i]==-2)
			{
				l--;
				s[l]=s[l]-s[l+1];
			}
			if (c[i]==-3)
			{
				l--;
				s[l]=s[l]*s[l+1];
			}
			if (c[i]==-4)
			{
				l--;
				s[l]=s[l]/s[l+1];
			}
		}
		
		
			
			
			
			
			
		
	}
	
	printf ("%i",s[1]);
	return 0;
}