Cod sursa(job #288984)

Utilizator alexandru92alexandru alexandru92 Data 26 martie 2009 11:49:50
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 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;
     }
void transform()
   {int i=0,lg=-1,vf=0,ok,p;
    gets(expresie);
    while(i<strlen(expresie))
	 {ok=0;
	  while(expresie[i]>='0'&&expresie[i]<='9')
	       forma[++lg]=expresie[i++],ok=1;
	  if(ok) forma[++lg]='.';
	    else
	       {p=prioritate(expresie[i]);
		if(p==0) st[++vf]=expresie[i++];
		  else if(p==4) {while(st[vf]!='('&&vf)
				 forma[++lg]=st[vf--];
				 ++i; --vf;
				}
			  else if(p==3) st[++vf]=expresie[i++];
				 else {while(vf&&p<=prioritate(st[vf]))
				       forma[++lg]=st[vf--];
				       st[++vf]=expresie[i++];
				      }
		}
	  }
    while(vf) forma[++lg]=st[vf--];
   }
long evaluate()
   {
    long i,b,a,vf=1;
    for(i=0;i<strlen(forma);)
       if(forma[i]>='0'&&forma[i]<='9')
	 {v[vf++]=atol(forma+i);
	  while((forma[i]>='0'&&forma[i]<='9')||forma[i]=='.') ++i;
	 }
	 else {b=v[--vf]; a=v[--vf];
	       switch(forma[i])
		       {
			case '+': v[vf]=a+b;break;
			case '-': v[vf]=a-b;break;
			case '*': v[vf]=a*b;break;
			case '/': v[vf]=a/b;break;
			case '^': v[vf]=powl(a,b);break;
		       }
	       ++vf; ++i;
	       }
     return v[1];
    }
int main()
  {
   freopen("evaluare.in","rt",stdin);
   freopen("evaluare.out","wt",stdout);
   transform();
   printf("%ld\n",evaluate());
   return 0;
  }