Cod sursa(job #161947)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 19 martie 2008 00:57:19
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <string.h>
#include <stdio.h>
#define N 100000
#define M 100001
union op
{char operatie;
 long constanta;
// char variabila;
}postfix[N];
long vfp;
char line[M],*c;
char stack[N];
char flag[N];
long stack2[N];
long vfs;

void adauga_stiva(char c)
{stack[++vfs]=c;}

char scoate_stiva()
{return stack[vfs--];}

void adauga_postfix_op(char c)
{flag[++vfp]=0;
 postfix[vfp].operatie=c;
}
void adauga_postfix_ct(long c)
{flag[++vfp]=1;
 postfix[vfp].constanta=c;
}


int main ()
{vfs=vfp=0;
 char opr[10]={"+-*/"};
 long r;
 int i,a,b;
 FILE *f=fopen("evaluare.in","r");
 fscanf(f,"%s",line);
 c=line;
 while(*c!=NULL)
 {if(*c=='(')
  {adauga_stiva('(');
  }
  else if(*c==')')
  {while(stack[vfs]!='(')
   {adauga_postfix_op(scoate_stiva());
   }
   scoate_stiva();
  }
  else if(strchr(opr,*c))
  {if(vfs==0)
   adauga_stiva(*c);
   else if((strchr(opr,*c)-opr)/2>(strchr(opr,stack[vfs])-opr)/2)
   {adauga_stiva(*c);
   }
   else
   {while((strchr(opr,*c)-opr)/2<(strchr(opr,stack[vfs])-opr)/2&&vfs)
    {adauga_postfix_op(scoate_stiva());
    }
    adauga_stiva(*c);
   }
  }
  if(!(*c>='0'&&*c<='9'))
  {c++;
  }
  else
  {for(r=0;*c>='0'&&*c<='9';c++)
   {r=r*10+(*c)-'0';
   }
   adauga_postfix_ct(r);
  }
 }
 while(vfs)
 {adauga_postfix_op(scoate_stiva());
 }

 
 for(i=1,vfs=0;i<=vfp;i++)
 {if(flag[i]==1)
  {stack2[++vfs]=postfix[i].constanta;
  }
  else
  {a=stack2[vfs--];b=stack2[vfs--];
   switch(postfix[i].operatie)
   {case '+': stack2[++vfs]=a+b;break;
    case '*': stack2[++vfs]=a*b;break;
    case '-': stack2[++vfs]=b-a;break;
    case '/': stack2[++vfs]=b/a;break;
   }
  }
 } 
 FILE *fout=fopen("evaluare.out","w");
 fprintf(fout,"%ld",stack2[1]);
 fclose(fout);

 return 0;
}