Cod sursa(job #147895)

Utilizator c_sebiSebastian Crisan c_sebi Data 3 martie 2008 18:21:25
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
//forma poloneza postfixata + eval
#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;
}