Cod sursa(job #155289)

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

#define dim 100001

char s[dim];

void citire() {
	freopen("evaluare.in","r",stdin),
	gets(s);
	fclose(stdin);
}

void elimin(int &st, int &dr) {
	while(1)  {
		if(s[st]!='(' || s[dr]!=')') 
			return;

		int par = 0;
		for(int i = st + 1; i < dr; i++)  {
			par -= ((s[i]==')') - (s[i]=='('));
				if(par < 0) 
					return;
		}
		if(par) 
			return ;
		st++;
		dr--;
	}
}

int caut(int st, int dr, char semne[]){
	int par = 0;
	for(int 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(int st,int dr) {
	elimin(st,dr);
	long p = caut(st + 1, dr, "-+");
	if(p == -1)
		p = caut(st + 1, dr, "/*");
	if(p == -1) {		
		char p[11];
		strncpy(p, s + st, dr - st + 1);		
		p[dr - st + 2] = 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;
}