Cod sursa(job #288714)

Utilizator alexandru92alexandru alexandru92 Data 26 martie 2009 07:14:48
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
char expresie[100001],forma[100001],st[100001];
long v[100001];
inline int prioritate(char op)
     {
      if(op=='(') return 0;
      if(op=='+') return 1;
      if(op=='-') return 1;
      if(op=='/') return 2;
      if(op=='*') return 2;
      if(op=='^') return 3;
      if(op==')') return 4;
      return -1;
     }
int main()
  {int i,p,vf=0,lg=-1,ok;
   long a,b;
   freopen("evaluare.in","rt",stdin);
   freopen("evaluare.out","wt",stdout);
   gets(expresie);
   for(i=0;i<strlen(expresie);)
      {ok=0;
       while(expresie[i]>='0'&&expresie[i]<='9')
	   forma[++lg]=expresie[i++],ok=1;
       if(ok) forma[++lg]='.';
       if(ok==0)
	 {
	  p=prioritate(expresie[i]);
	  if(p==0) st[++vf]='(',++i;
	     else if(p==4)
		     {while(st[vf]!='('&&vf)
			   forma[++lg]=st[vf--];
		      ++i; vf--;
		     }
		     else while(prioritate(expresie[i])>0&&prioritate(expresie[i])<4)
			       {
				p=prioritate(expresie[i]);
				if(p==3) st[++vf]=expresie[i];
				  else if(p==prioritate(st[vf]))
					 {forma[++lg]=st[vf];
					  st[vf]=expresie[i];
					 }
					else if(p>prioritate(st[vf])) st[++vf]=expresie[i];
					     else forma[++lg]=st[vf],st[vf]=expresie[i];
				 ++i;
				}
	  }
       }
   while(vf) forma[++lg]=st[vf--];
   vf=1;
   for(i=0;i<strlen(forma);++i)
      if(forma[i]>='0'&&forma[i]<='9')
	{v[vf++]=atol(forma+i);
	while(forma[i]>='0'&&forma[i]<'9') ++i;
       }
	else if(prioritate(forma[i])>0&&prioritate(forma[i])<4)
	       {a=v[--vf]; b=v[--vf];
		switch(forma[i])
		      {
		       case '+': v[vf]=b+a;break;
		       case '-': v[vf]=b-a;break;
		       case '*': v[vf]=b*a;break;
		       case '/': v[vf]=b/a;break;
		       case '^': v[vf]=powl(b,a);break;
		      } ++vf;
	       }
   printf("%ld\n",v[vf-1]);
   return 0;
  }