Cod sursa(job #376417)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 21 decembrie 2009 15:34:21
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.9 kb
#include<iostream>
#include<fstream>

using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

char s[200000],stop[200000],stchar[200000],rez2[200000],rez3[200000],rez[200000];
int var[200000];
int i,j,k,vf,vf2,sc,constant,rezultat;

int main()

{ 
	f.getline(s,2000);
	for(i=0;i<strlen(s);i++)
	{   
		if('0'<=s[i] && s[i]<='9')
		{
			constant=s[i]-48;
			sc=sc*10+constant;
		}
  
        if( ('0'<=s[i] && s[i]<='9') && (s[i+1]<'0' || s[i+1]>'9') )
		{    
			 vf++;
             stchar[vf]=sc;
             sc=0;
		}
		
		if(s[i]=='(')
		{   
			vf2++;
			stop[vf2]='(';
			
		}
		
		if(s[i]=='+')
		{
			if(stop[vf2]!='(' && stop[vf2]!=')')
			{   
				vf++;
				stchar[vf]=stop[vf2];
				stop[vf2]='+';
			}
			else
			{   
				vf2++;
				stop[vf2]='+';
				
			}
		}
		
		if(s[i]=='-')
		{
			if(stop[vf2]!='(' && stop[vf2]!=')')
			{   
				vf++;
				stchar[vf]=stop[vf2];
				stop[vf2]='-';
			}
			else
			{   
				vf2++;
				stop[vf2]='-';
				
			}
		}
		
        if(s[i]=='*')
        {   
		   
            if(stop[vf2]=='-' || stop[vf2]=='+' || (stop[vf2]<='9' && stop[vf2]>='0'))
                { 
				  vf2++;
				  stop[vf2]='*';
			    }
			else
			    {  
				  vf++;
				  stchar[vf]=stop[vf2];
				  stop[vf2]='*';
			    }
		    
		}
		
		if(s[i]=='/')
        {   
		   if(stop[vf2]=='-' || stop[vf2]=='+' || (stop[vf2]<='9' && stop[vf2]>='0'))
           
                { 
				  vf2++;
				  stop[vf2]='/';
			    }
		   else
			    
			    { 
				  vf++;
				  stchar[vf]=stop[vf2];
				  stop[vf2]='/';
			    }		
		}
		
		if(s[i]==')')
		{ 
			k=vf2;
			while(stop[k]!='(' && k!=0)
			{   
				vf++;
				stchar[vf]=stop[k];
				k--;
				strcpy(stop+k+1,stop+k+2);
				
			}
			strcpy(stop+k,stop+k+1);
       }
		

		
	}
	k=0;
	vf++;
	for(k=0;k<=vf2;k++)
		if(stop[k]!=0)
			stchar[vf]=stop[k];
	
	/*
    for(i=0;i<=vf;i++)
	{  
	  if(stchar[i]!=0)
	  {		  
		if(stchar[i]=='*' || stchar[i]=='/' || stchar[i]=='-' || stchar[i]=='+')
			cout<<stchar[i]<<" ";
		else	
            cout<<int(stchar[i])<<" ";
	  }		
	}*/
	
	k=0;
	for(i=0;i<=vf;i++)
	  {  
	     if(stchar[i]!=0)
		 {
			 rez[k]=int(stchar[i]);
			 k++;
		 }
	  }
	
	vf=0;
	for(i=0;i<k;i++)
	{    
		
       if(rez[i]!='+' && rez[i]!='-' && rez[i]!='*' && rez[i]!='/')
	   {    
		    vf++;
			var[vf]=int(rez[i]);
			var[vf+1]=0;
	        
	   }
	  
	   if(rez[i]=='+')
	   {   
		   vf--;
		   var[vf]=var[vf+1]+var[vf];
		   var[vf+1]=0;
	   }
	       
	   if(rez[i]=='-')
	   {
		   vf--;
		   var[vf]=var[vf+1]-var[vf];
		   var[vf+1]=0;
	   }
	   
	   if(rez[i]=='*')
	   {
		   vf--;
		   var[vf]=var[vf+1]*var[vf];
		   var[vf+1]=0;
	   }
	   
	   if(rez[i]=='/')
	   {
		   vf--;
		   var[vf]=var[vf+1]/var[vf];
	   }
    }	
g<<var[vf]*(-1);

	return 0;
}