Cod sursa(job #1025713)

Utilizator vladrochianVlad Rochian vladrochian Data 10 noiembrie 2013 14:38:15
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
using namespace std;
const int inf=1<<30;
struct nod
{
	bool isop;
	int val;
	nod *l,*r;
}*a=new nod;
char str[100001];
int sz,exp[100000],p[100000],pos=1;
void getvect()
{
	int it=0,cpr=0,crt;
	start:
	while(str[it]=='(')
	{
		cpr+=2;
		it++;
	}
	for(crt=0;(str[it]>='0')&&(str[it]<='9');it++)
		crt=crt*10+(str[it]-'0');
	exp[sz]=crt;
	p[sz++]=inf;
	while(str[it]==')')
	{
		cpr-=2;
		it++;
	}
	switch(str[it])
	{
		case '+':
		case '-':
		p[sz]=cpr;
		break;
		case '*':
		case '/':
		p[sz]=cpr+1;
		break;
		default:
		return;
	}
	exp[sz++]=str[it++];
	goto start;
}
void build(nod *n,int s,int e)
{
	if(s==e)
		n->val=exp[s];
	else
	{
		int m=e;
		for(int i=e-1;i>=s;i-=2)
			if(p[i]<p[m])
				m=i;
		n->isop=1;
		n->val=exp[m];
		n->l=new nod;
		build(n->l,s,m-1);
		n->r=new nod;
		build(n->r,m+1,e);
	}
}
int eval(nod *n)
{
	if(!n->isop)
		return n->val;
	if(n->val=='+')
		return eval(n->l)+eval(n->r);
	if(n->val=='-')
		return eval(n->l)-eval(n->r);
	if(n->val=='*')
		return eval(n->l)*eval(n->r);
	if(n->val=='/')
		return eval(n->l)/eval(n->r);
}
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int main()
{
	fin>>str;
	getvect();
	build(a,0,sz-1);
	fout<<eval(a)<<"\n";
	return 0;
}