Cod sursa(job #741184)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 25 aprilie 2012 16:46:09
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <stdio.h>
#include <stack>
using namespace std;


const int dim = 100005;
char S[dim], P[dim];
int gp[127];

void initial (char s[], int gp[])
{
	fgets (s, dim, stdin);
	gp[')'] = 10;
	gp['+'] = gp['-'] = 15;
	gp['*'] = gp['/'] = 16;
	gp['('] = 20;
}

void polonez (char s[], int gp[], char a[])
{
	char c;
	int nr = -1;
	stack <char> S;
	
	
	for (int i = 0; s[i] != 0; i++)
	{
		c = s[i];
		
		if ('0' <= c && c <= '9')
		{
			a[++nr] = '.';
			for (; '0' <= c && c <= '9'; i++, c = s[i])
				a[++nr] = c;
			i--;
		}			
		else
		{
			while (!S.empty() && gp[S.top()] >= gp[c] && S.top() != '(')
			{
				a[++nr] = S.top();
				S.pop ();
			}
			if (c != ')')
				S.push (c);
			else
				S.pop ();
		}
	}
	while (!S.empty())
	{
		a[++nr] = S.top ();
		S.pop ();
	}
}

void evaluam (char s[])
{
	char c;
	int nr;
	stack <int> S;
	
	for (int i = 0; s[i] != 0; i++)
	{
		c = s[i];
		if (c == '.')
		{
			nr = 0;
			for (c = s[i+1]; '0' <= c && c <= '9'; i++, c = s[i+1])
				nr = nr * 10 + c - '0';
			S.push (nr);
		}
		else
		{
			nr = S.top ();
			S.pop ();
			switch (c)
			{
				case '+': S.top() += nr; break;
				case '-': S.top() -= nr; break;
				case '*': S.top() *= nr; break;
				case '/': S.top() /= nr; break;
			}
		}
	}
	printf ("%d\n", S.top());
}

int main ()
{
	freopen ("evaluare.in", "r", stdin);
	freopen ("evaluare.out", "w", stdout);
	
	initial (S, gp);
	polonez (S, gp, P);
	evaluam (P);
	
	return 0;
}