Cod sursa(job #808650)

Utilizator ahmed.abdraboahmed.abdrabo ahmed.abdrabo Data 7 noiembrie 2012 04:13:48
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <cstdio>
#include <deque>
#include <cstring>
#include <iostream>

using namespace std;

char S[1000000];

int next_int(deque<char> & A) {
	int n = 0;
	while ('0' <= A.front() && A.front() <= '9') {
		n = n * 10 + A.front() - '0';
		A.pop_front();
	}
	return n;
}

int f2(deque<char> & A) {
	deque<int> ans;
	int a, b;
	while (!A.empty()) {
		switch (A.front()) {
		case '+':
			A.pop_front();
			ans.push_back(next_int(A));
			break;
		case '-':
			A.pop_front();
			ans.push_back(-next_int(A));
			break;
		case '/':
			A.pop_front();
			a = ans.back();
			ans.pop_back();
			b = next_int(A);
			ans.push_back(a / b);
			break;
		case '*':
			A.pop_front();
			a = ans.back();
			ans.pop_back();
			b = next_int(A);
			ans.push_back(a * b);
			break;
		default:
			ans.push_back(next_int(A));
			break;
		}
	}
	int n = 0;
	while (!ans.empty()) {
		n += ans.front();
		ans.pop_front();
	}
	return n;
}

int f1(deque<char> & A) {
	deque<char> B;
	while (!A.empty()) {
		char c = A.front();
		A.pop_front();
		if (c == ')') {
			deque<char> d;
			while (c = B.back(), B.pop_back(), c != '(') {
				d.push_back(c);
			}
			char str[20];
			sprintf(str, "%d", f2(d));
			int size = strlen(str);
			for (int i = 0; i < size; i++) {
				B.push_back(str[i]);
			}
		} else {
			B.push_back(c);
		}
	}
	return f2(B);
}

int main() {
	freopen("evaluare.in", "r", stdin);
	freopen("evaluare.out", "w", stdout);
	scanf("%s", S);
	deque<char> V;
	for (int i = 0, size = strlen(S); i < size; i++) {
		V.push_back(S[i]);
	}
	printf("%d\n", f1(V));
	return 0;
}