Cod sursa(job #323113)

Utilizator GulyanAlexandru Gulyan Data 10 iunie 2009 19:36:28
Problema Evaluarea unei expresii Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.63 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(a == '*' || a == '/')
		return 0;
	if(b == '*' || b == '/')
		return 1;
	if(a == '+' || a == '-')
		return 0;
	if(b == '+' || b == '-')
		return 1;
	return 1;
}

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];

/*
	for(i=0;i<n;i++){
		if(P[i].op)
			printf("%c ", P[i].op);
		else
			printf("%d ", P[i].nr);
	}
	printf("\n");
*/
	vf = 0;
	for(i=0;i<n;i++){
		if(!P[i].op)
			S[vf++] = P[i];
		else {
			S[vf-2].nr = OP(S[vf-2].nr, S[vf-1].nr, P[i].op);
			S[vf-2].op = 0;
			vf -= 1;
		}
	}
	
	printf("%d\n", S[0].nr);
	
	return 0;
}