Cod sursa(job #354707)

Utilizator bogdanacmDrutu Bogdan bogdanacm Data 9 octombrie 2009 10:47:16
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>


using namespace std;

#define pb push_back
#define MAXN	100005

vector<int> STN;
vector<char> STS;

char buf[MAXN];
int cur=0;

int simply(int a, int b, char sig)
{
	switch(sig)
	{
		case '+':
			return a+b;
		case '-':
			return a-b;
		case '*':
			return a*b;
		case '/':
			return a/b;
	}
}

bool isSign(char c)
{
	if ((c == '+')||(c == '-')||(c == '*')||(c == '/'))
		return true;
	return false;
}

int getNumber()
{
	int t=0;
	while (buf[cur] >= '0' && buf[cur] <= '9' && cur<strlen(buf))
		t= t*10 + buf[cur++]-'0';
	return t;
}
int eval()
{
	char sig;
	int t1,t2;
	for (;cur < strlen(buf);)
	{
		if (buf[cur] == '(')
		{
			STS.pb('('), cur++;
			//printf("paranteza deschis\n");
			continue;
		}

		if (buf[cur] == ')')
		{
			while (STS.back() != '(')
			{
				sig = STS.back();
				STS.pop_back();
				t1 = STN.back();
				STN.pop_back();
				t2 = STN.back();
				STN.pop_back();
				STN.push_back(simply(t2,t1,sig));
			}
			cur++;
			//printf("paranteza inchis\n");
			continue;
		}
		
		if (isSign(buf[cur]))
		{
			STS.pb(buf[cur]), cur++;
			//printf("semn\n");
			continue;
		}
		
		t1 = getNumber();
		//printf("numar: %d CUR:%d \n",t1,cur);
		if ( STS.size() > 0 && ((STS.back() == '*') || (STS.back() == '/')) )
		{
			sig = STS.back();
			STS.pop_back();
			t2 = STN.back();
			STN.pop_back();
			STN.pb(simply(t2,t1,sig));
		}
		else
			STN.pb(t1);
	}
	while (STN.size() > 1)
	{
		sig = STS.back();
		STS.pop_back();
		t1 = STN.back();
		STN.pop_back();
		t2 = STN.back();
		STN.pop_back();
		STN.push_back(simply(t2,t1,sig));
	}
	return STN.back();
}

int main ()
{
	int i,j,k;
	freopen("evaluare.in","rt",stdin);
	freopen("evaluare.out","wt",stdout);
	
	fgets(buf,MAXN,stdin);
	buf[strlen(buf)-1] = '\0';
	printf("%d\n",eval());
	return 0;	
}