Cod sursa(job #1349763)

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

using namespace std;

char s[100010];

stack<int> st;

void eval(int type) {
	if(type == 0) {
		int val2 = st.top();
		st.pop();
		int op = st.top();
		st.pop();
		int val1 = st.top();
		st.pop();

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

		st.push(val1);
	} else if(type == 1) {
		int op, val1, val2;
		val2 = st.top();
		st.pop();

		while((op = st.top()) != '(') {
			st.pop();
			val1 = st.top();
			st.pop();

			switch(op)
			{
				case '+': val2 += val1; break;
				case '-': val2 = val1 - val2; break;
			}
		}
		st.pop();
		st.push(val2);
	} else {
		int op, val1, val2;
		val2 = st.top();
		st.pop();

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

		st.push(val2);
	}
}

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

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

		if(strchr("0123456789", c)) {
			int 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(nr);
			if(x == '*' || x == '/') {
				eval(0);
			}
		} else {
			x = c;
			if(c == ')') {
				eval(1);
			} else {
				st.push(c);
			}
		}

		++i;
	}

	eval(2);

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

	return 0;
}