Cod sursa(job #155326)

Utilizator zobicaMarin Marin zobica Data 11 martie 2008 21:09:20
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<stdio.h>
#include<string.h>

#define dim 1000001

char s[dim];

void citire() {
	freopen("evaluare.in","r",stdin),
	fgets(s, dim, stdin);
	if(s[strlen(s) - 1]=='\n') 
		s[strlen(s) - 1] = 0;
	fclose(stdin);
}

void elimin(long &st, long &dr) {
	while(1)  {
		if(s[st]!='(' || s[dr]!=')') 
			return;
		long par = 0;
		for(long i = st + 1; i < dr; i++)  {
			par -= ((s[i]==')') - (s[i]=='('));
			if(par < 0) 
				return;
		}
		if(par) 
			return ;
		st++;
		dr--;
	}
}

long caut(long st, long dr, char semne[]){
	long par = 0;
	for(long i = dr; i >= st; i--)  {
		par -= ((s[i]==')') - (s[i]=='('));
		if(!par && (s[i] == semne[0] || s[i] == semne[1])) 
			return i;
	}
	return -1;
}

long eval(long st, long dr) {
	elimin(st,dr);
	long p = caut(st + 1, dr, "-+");
	if(p == -1)
		p = caut(st + 1, dr, "/*");
	if(p == -1) {		
		char p[20];
		strncpy(p, s + st, dr - st + 1);		
		p[dr - st + 1] = 0;
		long x;
		sscanf(p,"%ld",&x);
		return x;
	}
	long e1 = eval(st ,p-1);
	long e2 = eval(p + 1,dr);
	switch(s[p]){
		case '+':
			return e1 + e2;
		case '-':
			return e1 - e2;
		case '*':
			return e1 * e2;
		default: 
			return e1 / e2;
	}
}

int main() {
	citire();	
	freopen("evaluare.out","w",stdout);
	printf("%ld",eval(0,strlen(s)-1));
	fclose(stdout);
	return 0;
}