Cod sursa(job #299080)

Utilizator adasarcaAda Sarca adasarca Data 6 aprilie 2009 16:15:18
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<fstream.h>
#include<string.h>
int prioritate(char c)
{
 if (c=='(') return 0;
 if (c=='+' || c=='-') return 1;
 if (c=='*'||c=='/') return 2;
  return 3;
}
char a1[100000],a2[100000],a3[100000],semn[]="+-*/";
int n2=-1,n3=-1,n;
long b[50000],nr;
int main()
{
 ifstream f("evaluare.in");
 ofstream g("evaluare.out");
 int i;
 f.get(a1,105);
 for(i=0;a1[i];i++)
 {
    if(a1[i]>='0'&&a1[i]<='9')
	{
	  while(a1[i]>='0'&&a1[i]<='9')
		  a3[++n3]=a1[i++];
	  i--;
	  a3[++n3]=' ';
    }
	  if(a1[i]=='(') a2[++n2]=a1[i];
	if(a1[i]==')')
				{
					while(a2[n2]!='(')
					{
						a3[++n3]=a2[n2--];
					}
					n2--;
				}
	if(strchr(semn,a1[i]))
	{
		while(prioritate(a1[i])<=prioritate(a2[n2])&&n2>=0)
			a3[++n3]=a2[n2--];
		a2[++n2]=a1[i];
	}

 }
 while(n2>-1) a3[++n3]=a2[n2--];
 for(i=0;i<=n3;i++)
 {
  if(a3[i]>='0'&&a3[i]<='9')
	{
	 nr=0;
	 while(a3[i]>='0'&&a3[i]<='9')
	  nr=nr*10+a3[i++]-'0';
	 b[++n]=nr;
	}
  if(strchr(semn,a3[i]))
  {
   switch(a3[i])
   {
    case '+':b[n-1]+=b[n--]; break;
    case '-':b[n-1]-=b[n--]; break;
    case '*':b[n-1]*=b[n--]; break;
    case '/':b[n-1]/=b[n--]; break;
   }
  }
 }
 g<<b[n];

 f.close();
 g.close();
 return 0;
}