Cod sursa(job #1392316)

Utilizator PatrikStepan Patrik Patrik Data 18 martie 2015 16:25:17
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<stdio.h>
#define LMAX 100001

char stc[LMAX] , s[LMAX];
int nr , op, semn = 1 , stn[LMAX];

void prod();
void sum();

int main()
{
	int i;

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

	scanf("%s" , s+1 );

	i = 1;
	while(s[i]){

		if(s[i] >= '0' && s[i] <= '9'){
			stn[++nr] = 0;
			while(s[i] >= '0' && s[i] <= '9'){
				stn[nr] = stn[nr]*10 + s[i] - 48;
				i++;
			}
			stn[nr]*=semn;
			semn = 1;
			continue;
			}
		
		if( s[i] == '*' || s[i] == '/' || s[i] == '(' )
			stc[++op] = s[i];
		else
			if(s[i] == ')'){
				prod();
				sum();
				if(stc[op] == '('){
					op--;
					i++;
					continue;
				}
			}
			else
				if(s[i] == '-' && !( s[i-1] >= '0' && s[i-1] <= '9') && s[i-1] != ')')
					semn = -1;
				else{
					prod();
					stc[++op] = s[i];
				}
				i++;
	}
	prod();
	sum();
	printf("%d\n" , stn[1]);
	return 0;
}

void sum()
{
	int newNr = nr-1 , newOp = op;
	if(stc[op] != '+' && stc[op] != '-')
		return;
	while(stc[newOp-1] == '+' || stc[newOp-1] == '-')
		newOp--, newNr--;
	for(int i = newOp , j = 1 ; i <= op ; ++i , ++j )
		if(stc[i] == '+')
			stn[newNr] += stn[newNr+j];
		else
			stn[newNr] -= stn[newNr+j];
	op = newOp-1;
	nr = newNr;
}

void prod()
{
	int newNr = nr-1 , newOp = op;
	if(stc[op] != '*' && stc[op] != '/')
		return;
	while(stc[newOp-1] == '*' || stc[newOp-1] == '/')
		newOp--, newNr--;
	for(int i = newOp , j = 1 ; i <= op ; ++i , ++j )
		if(stc[i] == '*')
			stn[newNr] *= stn[newNr+j];
		else
			stn[newNr] /= stn[newNr+j];
	op = newOp-1;
	nr = newNr;
}