Cod sursa(job #323098)

Utilizator GulyanAlexandru Gulyan Data 10 iunie 2009 18:58:37
Problema Evaluarea unei expresii Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.59 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SMAX 100000

int isDigit(char c)
{
	return c >= '0' && c <= '9';
}

typedef struct{
	int nr;
	char op;
} EL;

int Prior(char a, char b)
{
	if(b == '*' || b == '/')
		return 1;
	if(a == '*' || a == '/')
		return 0;
	if(b == '+' || b == '-')
		return 1;
	if(a == '+' || a == '-')
		return 0;
	return 0;
}

int OP(int a, int b, char c)
{
	switch(c){
		case '*':
			return a * b;
		case '/':
			return a / b;
		case '+':
			return a + b;
		case '-':
			return a - b;
	}
	return 0;
}

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

	char buff[SMAX], op;
	EL P[SMAX], S[SMAX];
	int n, vf = n = 0;
	int i, nr;

	fgets(buff, SMAX, stdin);

	//cat timp exista caractere
	for(i=0; buff[i] && buff[i] != '\n'; ++i){
		if(isDigit(buff[i])){
			nr = (int)(buff[i] - '0');
			while(isDigit(buff[++i]))
				nr = nr * 10 + (int)(buff[i] - '0');
			//printf("nr:%d\n", nr);
			P[n].nr = nr;
			P[n++].op = 0;
			if(!buff[i] || buff[i] == '\n')
				break;
		}
		op = buff[i];
		if(op == '(')
			S[vf++].op = op;
		else if(op == ')'){
			while(vf > 0 && S[vf-1].op != '(')
				P[n++] = S[--vf];
			--vf;
		}
		else{
			while(vf > 0 && Prior(S[vf-1].op, op))
				P[n++] = S[--vf];
			S[vf++].op = op;
		}
	}

	while(vf > 0)
		P[n++] = S[--vf];

	while(n){
		if(!P[n-1].op)
			S[vf++] = P[n-1];
		else 
			S[vf-3].nr = OP(S[vf-1].nr, S[vf-2].nr, S[vf-3].op);
			S[vf-3].op = 0;
			vf -= 2;
	}
	
	printf("%d\n", S[0].nr);
	
	return 0;
}