Cod sursa(job #156031)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 12 martie 2008 12:16:53
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
#include <cctype>
#include <cassert>

const int NMAX = 1 << 17;

char S[NMAX], op[NMAX];
int NP, polo[NMAX], NO;

void eval(char op) {
	int v = 0;
	switch (op) {
		case '+': v = polo[NP-1] + polo[NP]; break;
		case '-': v = polo[NP-1] - polo[NP]; break;
		case '*': v = polo[NP-1] * polo[NP]; break;
		case '/': v = polo[NP-1] / polo[NP]; break;
		default: assert(true);
	}
	polo[--NP] = v;
}

int main(void) {	
	FILE *fin = fopen("evaluare.in", "rt");

	fscanf(fin, " %s", S);

	fclose(fin);

	int i, u;

	NP = -1; NO = -1;
	for (i = 0; S[i]; ++i) {
		switch (S[i]) {
			case '(': op[++NO] = '('; break;
			case ')': 
				while (op[NO] != '(')
					eval(op[NO--]);
				--NO;
				break;
			case '+':
			case '-':
				while (op[NO] == '*' || op[NO] == '/')
					eval(op[NO--]);
			case '/':
			case '*':
				op[++NO] = S[i];
				break;
			default:
				for (u = 0; isdigit(S[i]); ++i)
					u = u * 10 + (S[i] - '0');
				--i;
				polo[++NP] = u;
		}
	}

	while (NO >= 0 && op[NO] != '(') eval(op[NO--]);

	FILE *fout = fopen("evaluare.out", "wt");

	fprintf(fout, "%d\n", polo[0]);

	fclose(fout);

	return 0;
}