Cod sursa(job #579813)

Utilizator alexamiu2008Miu Alexandra alexamiu2008 Data 12 aprilie 2011 14:53:55
Problema Evaluarea unei expresii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>
#include<string.h>
FILE*fin,*fout;
char v[100001],ch,st[50001];
int op[50001],i,j,l,pr[256],k,d,nr;
void calcul(){
int rez;
 switch(st[d]){
 case '+':rez=op[k-1]+op[k];break;
 case '-':rez=op[k-1]-op[k];break;
 case '*':rez=op[k-1]*op[k];break;
 case '/':rez=op[k-1]/op[k];break;

  }
  d--;
  k--;
  op[k]=rez;

}

int main() {
fin=fopen("evaluare.in","r");
fout=fopen("evaluare.out","w");
fgets(v,1000,fin);
l=strlen(v);
if(v[l-1]=='\n'){v[l-1]=0;l--;}
pr['(']=0;
pr['+']=pr['-']=1;
pr['*']=pr['/']=2;
int ok=0;
for(i=0;i<l;i++){
if(v[i]>='0'&&v[i]<='9'){
      nr=nr*10+v[i]-'0';
      ok=1;
  }
else{
      if(ok==1){
	  op[++k]=nr;
	  ok=0;nr=0;
      }
    if(v[i]=='('){
	  st[++d]=v[i];
	       }
     else{
       if(v[i]==')'){
	    while(st[d]!='('){
		    calcul();
	    }
	   d--;//elimin paranteza( din stiva
	}
	else{
	       while(d>0&&pr[v[i]]<=pr[st[d]]){
			calcul();
		}
	       st[++d]=v[i];
	    }
      }
  }
}
if(ok==1){
op[++k]=nr;
}
while(d>0){
calcul();
}
fprintf(fout,"%d",op[1]);

return 0;
}