Cod sursa(job #147911)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 3 martie 2008 18:34:21
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
char e[100001], *p=e;int lgpol, pol[100001];struct nod{	int inf;	nod *urm;} *prim=NULL;void transExp();void transTerm();
void transFact();void transExp(){
	char c;
	transTerm();	while(*p=='+' || *p=='-'){
		c=*p;		p++;
		transTerm();		if(c=='+')			pol[lgpol++] = -1;		else pol[lgpol++] = -2;
	}
}void transTerm(){	char c;	transFact();	while(*p=='*' || *p=='/'){		c = *p; p++;		transFact();		if(c=='*')
			pol[lgpol++] = -3;
		else
			pol[lgpol++] = -4;
	}
}
void transFact(){	if(*p=='('){		p++;		transExp();		p++;	}	else{	while(*p>='0' && *p<='9') pol[lgpol] = pol[lgpol]*10 + *p-'0', p++;		lgpol++;	}
}
int eval(){int i=0;	while(i<lgpol){	if(pol[i]>=0){		nod *p = new nod;	p->inf = pol[i];	p->urm = prim;		prim = p;			i++;
		}
		else {
			int v=prim->inf;nod *p = prim; prim=prim->urm; delete p;if(pol[i]==-1) prim->inf+=v;		else if(pol[i]==-2) prim->inf-=v;			else if(pol[i]==-3) prim->inf*=v;			else if(pol[i]==-4) prim->inf/=v;
			i++;
		}
	}
	return prim->inf;
}

int main(){	FILE *f=fopen("evaluare.in", "r");FILE *g=fopen("evaluare.out", "w");fscanf(f, "%s", e);	transExp();	fprintf(g, "%d\n", eval());
	fclose(f);	fclose(g);	return 0;}