Cod sursa(job #1349784)

Utilizator cristian.enciuCristian Enciu cristian.enciu Data 20 februarie 2015 14:45:25
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include<stdio.h>
#include<stack>
#include<string.h>

using namespace std;

char s[100010];

deque<long> st;

void eval(long type) {
	if(type == 0) {
		long val2 = st.back();
		st.pop_back();
		long op = st.back();
		st.pop_back();
		long val1 = st.back();
		st.pop_back();

		switch(op)
		{
			case '*': val1 *= val2; break;
			case '/': val1 /= val2; break;
		}

		st.push_back(val1);
	} else if(type == 1) {
		long op, val1, val2;
		val2 = st.back();
		st.pop_back();

		while((op = st.back()) != '(') {
			st.pop_back();
			val1 = st.back();
			st.pop_back();

			switch(op)
			{
				case '+': val2 += val1; break;
				case '-': val2 = val1 - val2; break;
			}
		}
		st.pop_back();
		long x = 0;
		if(!st.empty()) {
			x = st.back();
		}
		st.push_back(val2);

		if(x == '*' || x == '/') {
			eval(0);
		}
	} else {
		long op, val1, val2;
		val1 = st.front();
		st.pop_front();

		while(!st.empty()) {
			op = st.front();
			st.pop_front();
			val2 = st.front();
			st.pop_front();
			switch(op)
			{
				case '+': val1 += val2; break;
				case '-': val1 -= val2; break;
				case '*': val1 *= val2; break;
				case '/': val1 /= val2;
			}
		}

		st.push_back(val1);
	}
}

int main() {
	freopen("evaluare.in", "r", stdin);
	freopen("evaluare.out", "w", stdout);

	scanf("%s", s);
	long i = 0, n = strlen(s);
	char x = 0;
	while(i < n) {
		char c = s[i];

		if(strchr("0123456789", c)) {
			long nr = c - '0';
			++i;
			c = s[i];
			while(strchr("0123456789", c) && i < n) {
				nr = nr * 10 + c - '0';
				++i;
				c = s[i];
			}
			--i;
			st.push_back(nr);
			if(x == '*' || x == '/') {
				eval(0);
			}
		} else {
			x = c;
			if(c == ')') {
				eval(1);
			} else {
				st.push_back(c);
			}
		}

		++i;
	}

	eval(2);

	printf("%d ", st.front());

	return 0;
}