Cod sursa(job #696942)

Utilizator DSzprogDombi Szabolcs DSzprog Data 28 februarie 2012 21:04:11
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <malloc.h>
#include <cstring>
#include <cstdio>
#include <cmath>

char data[100128];

struct Value {
	int val;
	int imp;
	char oper;
	Value * next;
};

Value * list;
Value ** cnt = &list;

void add(int val, int imp, char oper) {
	(*cnt) = (Value *)malloc(sizeof(Value));
	(*cnt)->val = val;
	(*cnt)->imp = imp;
	(*cnt)->oper = oper;
	(*cnt)->next = 0;
	cnt = &(*cnt)->next;
}

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

	int n = strlen(fgets(data, 100128, in)) - 1;
	int value = 0, importance = 0;

	add(0, 0, 0);
	for (int i = 0; i < n; ++i) {
		if (data[i] == '(') {
			importance += 2;
		} else if (data[i] == ')') {
			importance -= 2;
		} else {
			if (data[i] == '+' || data[i] == '-') {
				add(value, importance + 1, data[i]);
				value = 0;
			} else if (data[i] == '*' || data[i] == '/') {
				add(value, importance + 2, data[i]);
				value = 0;
			} else {
				value = value * 10 + data[i] - '0';
			}
		}
	}
	add(value, 0, '=');
	add(0, 0, 0);

	Value * v = list;
	while (list->next->next->oper) {
		if (v->imp < v->next->imp && v->next->imp >= v->next->next->imp) {
			switch(v->next->oper) {
				case '+':
					v->next->next->val = v->next->val + v->next->next->val;
					break;

				case '-':
					v->next->next->val = v->next->val - v->next->next->val;
					break;

				case '*':
					v->next->next->val = v->next->val * v->next->next->val;
					break;

				case '/':
					v->next->next->val = v->next->val / v->next->next->val;
					break;
			}
			v->next = v->next->next;
			v = list;
		} else {
			v = v->next;
		}
		if (!v->next->next) {
			v = list;

		}
	}

	fprintf(out, "%d\n", list->next->val);

	fclose(in);
	fclose(out);
}