Cod sursa(job #248585)

Utilizator StigmaSimina Pitur Stigma Data 26 ianuarie 2009 01:11:15
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <stdlib.h>

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");


char const op1[]="+-", op2[]="*/", op[]="+/-*()", tot[]="0123456789+-/*()";

struct nod{int info; nod *s,*d;};


char e[1000],ch, *c;
long q[1000],p[1000],v;
int n;
nod *rad;


void vsd(nod *i)
{if (i)
 {if (e[i->info])
  fout<<e[i->info];
  else
   fout<<q[i->info];
  vsd(i->s);

  vsd(i->d);
 }
}


int calc(nod *i)
{int as,ad;
 if (!i->s) return (q[i->info]);

  as=calc(i->s);
  ad=calc(i->d);
  if (e[i->info]=='+') return as+ad;
  if (e[i->info]=='-') return as-ad;
  if (e[i->info]=='*') return as*ad;
  return as/ad;

}



nod *polon(int li, int ls)
{int i,k;
 nod *d;
 long min=30000;

 d=new nod;

 for (i=li;i<=ls;i++)
  if (p[i]<min)
   {min=p[i]; k=i;}


 d->info=k;
 if (li==ls) {d->s=0; d->d=0;}
 else {d->s=polon(li,k-1);
       d->d=polon(k+1,ls);}

 return d;
}



int main()
{int i,m,sw;

n=-1;
v=0;
sw=1;
fin.get(ch);;

 while (sw)
  if (strchr(op1,ch)) //operator de prioritate mica
    {n++;
     e[n]=ch;
     p[n]=v+1;
     fin.get(ch);;
     if(!strchr(tot,ch)) sw=0;
     }

   else
    if (strchr(op2,ch)) //operator de prioritate mare
    {n++;
     e[n]=ch;
     p[n]=v+10;
     fin.get(ch);;

     if(!strchr(tot,ch)) sw=0;
     }

    else
      if (ch=='(') //p. deschisa -> crestem v
       {v+=10; fin.get(ch);;
     if(!strchr(tot,ch)) sw=0;}

	else
	 if (ch==')')  //p. inchisa -> descrestem v
	   {v-=10; fin.get(ch);;
     if(!strchr(tot,ch)) sw=0;}

	    else //NUMAR
	     {n++;
	      while (!strchr(op,ch) && sw)
	       {c=&ch;
		q[n]=q[n]*10+atoi(c);
		fin.get(ch);;
		if(!strchr(tot,ch)) sw=0;
		}

	       p[n]=v+1000;
	      }




rad=polon(0,n);

fout<<calc(rad);
fout.close();
return 0;
}