Cod sursa(job #407883)

Utilizator giuliastefGiulia Stef giuliastef Data 2 martie 2010 18:21:47
Problema Evaluarea unei expresii Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
//evaluarea unei expresii

#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
char fp[20000],st[10000],p1[]="*/",p2[]="+-";
int k1=-1,k2;
int main()
{
    char e[10001];
    int i,k,s[10001],nr;
    ifstream f("evaluare.in");
    ofstream g("evaluare.out");
    f>>e;
    for(i=0;e[i];i++)
    {
     if(isdigit(e[i]))
     {
		while(isdigit(e[i]))
		{
		 fp[++k1]=e[i];
		 if(e[i]) i++;
		}
		fp[++k1]='.';
     }
     if(strchr(p1,e[i])&&e[i]) 
     {
	       if((strchr(p1,st[k2])&&k2>=0))
	       {
		k2--;
		while(strchr(p1,st[k2])&&k2>=0)
		 fp[++k1]=st[k2--], fp[++k1]='.';
		st[++k2]=e[i], st[++k2]=0;
		}
		else
		 st[k2++]=e[i], st[k2]=0;
	       }
	       if(strchr(p2,e[i])&&e[i])
	       {
		k2--;
		if((strchr(p2,st[k2])||strchr(p1,st[k2]))&&k2>=0)
		{
		while((strchr(p2,st[k2])||strchr(p1,st[k2]))&&k2>=0)
		 fp[++k1]=st[k2], st[k2--]=0, fp[++k1]='.';
		st[++k2]=e[i], st[++k2]=0;
		}
		else
		 st[++k2]=e[i], st[++k2]=0;
	       }
	       if(e[i]=='(') st[k2++]=e[i], st[k2]=0;
	       if(e[i]==')')
	       {
		while(st[--k2]!='(')
		 fp[++k1]=st[k2], fp[++k1]='.';
	       }
    }
    k2--;
    while(k2>=0)
     fp[++k1]=st[k2--], fp[++k1]='.';
    k=0;
    for(i=0;fp[i];i++)
    {
     if(isdigit(fp[i]))
     {
      nr=atoi(&fp[i]);
      if(nr) i=i+log10(nr);
      s[++k]=nr;
     }
     if(fp[i]=='/')
      s[k-1]=s[k-1]/s[k--];
     if(fp[i]=='*')
      s[k-1]=s[k-1]*s[k--]; 
     if(fp[i]=='+')   
      s[k-1]=s[k-1]+s[k--];
     if(fp[i]=='-')
      s[k-1]=s[k-1]-s[k--];
    }
    g<<s[1]<<"\n";
    f.close();
    g.close();
    return 0;
}