Cod sursa(job #517344)

Utilizator ioana23Ioana Ioana ioana23 Data 28 decembrie 2010 14:57:56
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#include <string.h>

char s[100001];

long paranteze (long &st, long &dr)
{
	long nr = 0;
	while(s[st] == '(' && s[dr] == ')')
		st++, dr--;
	for(long i = st; i<=dr; i++)
	{
		if( s[i] == '(')
			nr++;
		if( s[i] == ')')
			nr--;
		if(nr < 0)
			return 0;
	}
	return 1;
}

long semn(long &st, long &dr, char c1, char c2)
{
	long nrr = 0;
	while(s[st] == '(' && s[dr] == ')')
		st++, dr--;
	for(long i = st; i<=dr; i++)
	{
		if(s[i] == '(')
			nrr++;
		else
			if(s[i] == ')')
				nrr--;
			else
				if( (s[i] == c1 || s[i] == c2) && nrr == 0)
					return i;
	}
	return -1;
}

long transf(long st, long dr)
{
	long x = 0;
	for(long i = st; i<=dr; i++)
		x = x*10 + (s[i] - '0');
	return x;
}

long fct (long st, long dr)
{
	while(s[st] == ' ')
		st++;
	while(s[dr] == ' ')
		dr--;
	if(paranteze(st, dr))
	{
		long ss = semn(st, dr, '+', '-');
		if(ss == -1)
			ss = semn(st, dr, '*', '/');
		if(ss == -1)
			return transf(st, dr);
		long s1 = fct(st, ss-1), s2 = fct(ss+1, dr);
		switch(s[ss])
		{
			case '+': return s1+s2;
			case '-':  return s1-s2;
			case '*': return s1*s2;
			default:  return s1/s2;
		}
	}
}

int main ()
{
	freopen("evaluare.in", "r", stdin);
	freopen("evaluare.out", "w", stdout);

	fgets(s, 100000, stdin);
	long n =  strlen(s);

	long a = fct(0, n-2);
	printf("%ld\n", a);

	return 0;
}