Pagini recente » Cod sursa (job #702612) | Cod sursa (job #2532724) | Rezultatele filtrării | Cod sursa (job #1768982) | Cod sursa (job #1025713)
#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;
}