Cod sursa(job #809441)

Utilizator radustn92Radu Stancu radustn92 Data 8 noiembrie 2012 13:38:43
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#include <iostream>
#include <map>
#include <string>
#define NMAX 100005
using namespace std;
map <char,int> H;
string s;
int nrs[NMAX],r,t;
char ops[NMAX];
void init()
{
	H['*']=9; H['/']=9;
	H['+']=8; H['-']=8;
    H['(']=2; H[')']=2;
	H['$']=1;
}
inline int cif(char x)
{
	return x>='0' && x<='9';
}
void changes()
{
	switch (ops[t])
	{
		case '+': nrs[r-1]=nrs[r-1]+nrs[r]; break ;
		case '-': nrs[r-1]=nrs[r-1]-nrs[r]; break ;
		case '*': nrs[r-1]=nrs[r-1]*nrs[r]; break ;
		case '/': nrs[r-1]=nrs[r-1]/nrs[r]; break ;
	}
	r--; t--;
}
void solve()
{
	ops[++t]='$';
	int i;
	char ch;
	for (i=0; i<s.size(); i++)
	{
		ch=s[i];
		if (cif(ch))
		{
			nrs[++r]=0;
			while (i<s.size() && cif(s[i]))
				nrs[r]=nrs[r]*10+s[i]-'0',i++;
			i--;
			continue ;
		}
		
		if (!H[ch])
			continue;
		if (ch=='(' || H[ch]>H[ops[t]])
		{
			ops[++t]=ch;
			continue ;
		}
		if (H[ch]<=H[ops[t]])
		{
			while (H[ch]<=H[ops[t]] && ops[t]!='(')
				changes();
			if (ch==')' && ops[t]=='(')
			{
				t--;
				continue ;
			}
			ops[++t]=ch;
		}
	}
	while (t!=1)
		changes();
	cout<<nrs[1]<<'\n';
}
int main()
{
	freopen("expr.in","r",stdin);
	freopen("expr.out","w",stdout);
	init();	
	cin>>s;
	solve();
	return 0;
}