Cod sursa(job #633419)

Utilizator JBaccountCatalin JBaccount Data 13 noiembrie 2011 19:15:12
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;

#define PB push_back

char expresie[100005];

int numar (int start, int stop)
{
	int ans = 0;
	for (int i = start; i <= stop; ++i) ans = (ans * 10 + (expresie[i] - '0'));
	return ans;
}

int baza(int start, int stop)
{
	for (int i = start; i <= stop; ++i) if (!isdigit(expresie[i])) return 0;
	return 1;
}

int proc (int a, int b, char semn)
{
	if (semn == '+') return a + b;
	if (semn == '-') return a - b;
	if (semn == '*') return a * b;
	if (semn == '/') return a / b;
	return 0;
}

int evalueaza (int start, int stop)
{
	vector <int> pm;
	vector <int> md;
	
	if (baza(start, stop)) return numar(start, stop);
	int par = 0;
	
	for (int i = start; i <= stop; ++i)
	{	
		if (expresie[i] == '(') ++par;
		else if (expresie[i] == ')') --par;
		
		if (par == 0 && (expresie[i] == '+' || expresie[i] == '-')) pm.PB(i);
		if (par == 0 && (expresie[i] == '*' || expresie[i] == '/')) md.PB(i);
	}		
	
	int ans;
	
	if (pm.size() != 0)
	{
		pm.PB(stop + 1);
		ans = evalueaza(start, pm[0]-1);
		for (int i = 0; i < pm.size() - 1; ++i)
		{
			int termen = evalueaza(pm[i]+1, pm[i+1]-1);
			ans = proc(ans, termen, expresie[pm[i]]);
		}
		return ans;	
	}	
	else
	if (md.size() != 0)
	{
		md.PB(stop + 1);
		ans = evalueaza(start, md[0]-1);
		for (int i = 0; i < md.size() - 1; ++i)
		{
			int termen = evalueaza(md[i]+1, md[i+1]-1);
			ans = proc(ans, termen, expresie[md[i]]);
		}
		return ans;	
	}
	else return evalueaza(start + 1, stop - 1);
}

int main()
{
	freopen ("evaluare.in", "r", stdin);
	freopen ("evaluare.out", "w", stdout);
	
	scanf ("%s", expresie);
	
	printf ("%d\n", evalueaza(0, strlen(expresie)-1));
	
	return 0;
}