Cod sursa(job #1302482)

Utilizator whoasdas dasdas who Data 26 decembrie 2014 22:32:07
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#define IA_PROB "evaluare"

#include <cstdio>
#include <cstring>

#include <fstream>

#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>

#include <algorithm>

using namespace std;

string ops[2] = {"+-", "*/"};

int eval(char *&p, int level);

int op_level(char op)
{
	switch (op) {
	case '+':
	case '-':
		return 0;
	case '*':
	case '/':
		return 1;
	default:
		return -1;
	}
}

int eval_op(char op, int a, int b)
{
	switch (op) {
	case '+': return a + b;
	case '-': return a - b;
	case '*': return a * b;
	case '/': return a / b;
	default: exit(-2);
	}
}

int operand(char *&p)
{
	int res;
	if (*p == '(') {
		p++;
		res = eval(p, 0);
		p++;	/* to skip over ')' */
	} else {
		res = 0;
		while (*p >= '0' && *p <= '9') {
			res = res * 10 + *p - '0';
			p++;
		}
	}
	return res;
}

int eval(char *&p, int level)
{
	if (level == 2) {
		return operand(p);
	} else {
		int a = eval(p, level + 1);
		while (op_level(*p) == level) {
			char op = *p;
			p++;
			int b = eval(p, level + 1);
			a = eval_op(op, a, b);
		}
		return a;
	}
}

int main()
{
	ifstream in(IA_PROB".in");
	ofstream out(IA_PROB".out");
	string s;
	in>>s;
	char *p = (char*)s.c_str();
	out<<eval(p, 0)<<endl;

	return 0;
}