Mai intai trebuie sa te autentifici.

Cod sursa(job #1525251)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 14 noiembrie 2015 21:31:32
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <vector>
#include <cstring>
#include <cctype>
using namespace std;

#ifdef INFOARENA
#define ProblemName "evaluare"
#endif

#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif

template <class T> void readNum(T &nr) {
	nr = 0;
	T sign = 1;
	char c;
	while (!isdigit(c = getchar()))
		(c == '-') && (sign = -1);
	do {
		nr = nr * 10 + c - '0';
	} while (isdigit(c = getchar()));
	nr *= sign;
}

#include <stack>

class _prec {
private:
	vector<char> v;
public:
	_prec() {
		v.resize(255);
		memset(&v[0], 0, sizeof(v[0]) * v.size());
		v['('] = 1;
		v['+'] = v['-'] = 2;
		v['*'] = v['/'] = 3;
	}
	char operator()(char c) {
		return v[c];
	}
} prec;

int mat_eval(char op, int n1, int n2) {
	switch (op)
	{
	case '+':
		return n2 + n1;
	case '-':
		return n2 - n1;
	case '*':
		return n2 * n1;
	case '/':
		return n2 / n1;
	default:
		break;
	}
	return 0;
}

void mktree(stack<char>& S1, stack<int>& S2) {
	char op = S1.top();
	S1.pop();
	int n1 = S2.top();
	S2.pop();
	int n2 = S2.top();
	S2.pop();
	S2.push(mat_eval(op, n1, n2));
}

void parseinput() {
	char c;
	stack<char> S1; stack<int> S2;
	int curNr = 0; bool inNr = false;
	while ((c = getchar()) && !feof(stdin)) {
		if (c <= '9' && c >= '0') {
			curNr = curNr * 10 + c - '0';
			inNr = true;
			continue;
		}
		if (inNr) {
			S2.push(curNr);
			curNr = 0;
			inNr = false;
		}
		if (c == '(')
			S1.push(c);
		else if (prec(c)) {
			while (!S1.empty() && prec(c) <= prec(S1.top()))
				mktree(S1, S2);
			S1.push(c);
		}
		else if (c == ')') {
			while (S1.top() != '(')
				mktree(S1, S2);
			S1.pop();
		}
	}
	if (inNr) {
		S2.push(curNr);
		curNr = 0;
		inNr = false;
	}
	while (!S1.empty())
		mktree(S1, S2);
	printf("%d\n", S2.top());
	S2.pop();
}

int main() {
	assert(freopen(InFile, "r", stdin));
	assert(freopen(OuFile, "w", stdout));
	parseinput();
	return 0;
}