Pagini recente » Cod sursa (job #2290254) | Cod sursa (job #2718499) | Cod sursa (job #257661) | Cod sursa (job #2832028) | Cod sursa (job #950100)
Cod sursa(job #950100)
#include<fstream>
#include<cstring>
#define DMAX 100002
#define INF 21000000
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
struct nod
{
char op;
int nr;
nod *st, *dr;
}*c;
union cell
{
int nr;
char op;
}ec[DMAX];
char s[DMAX];
int i,j,n,pr[DMAX],nr,rez;
nod *creare_arb(int ls,int ld,cell ec[],int pr[])
{
nod *c;
int i,pminn,minn=INF;
for(i=ls;i<=ld;++i)
if(pr[i]<=minn)
minn=pr[i], pminn=i;
c=new nod;
if(minn==INF)
c->nr=ec[pminn].nr;
else
c->op=ec[pminn].op;
if(ls==ld)
c->st=c->dr=0;
else
c->st=creare_arb(ls,pminn-1,ec,pr),
c->dr=creare_arb(pminn+1,ld,ec,pr);
return c;
}
void calc(nod *c)
{
if(c)
{
calc(c->st);
calc(c->dr);
switch (c->op)
{
case '+': c->nr=c->st->nr+c->dr->nr; break;
case '-': c->nr=c->st->nr-c->dr->nr; break;
case '*': c->nr=c->st->nr*c->dr->nr; break;
case '/': c->nr=c->st->nr/c->dr->nr; break;
}
}
}
int main()
{
fin.get(s,DMAX);
n=strlen(s);
for(i=0;i<n;++i)
switch (s[i])
{
case ')': nr-=10; break;
case '(': nr+=10; break;
case '+': pr[j]=nr+1; ec[j++].op=s[i]; break;
case '-': pr[j]=nr+1; ec[j++].op=s[i]; break;
case '*': pr[j]=nr+10; ec[j++].op=s[i]; break;
case '/': pr[j]=nr+10; ec[j++].op=s[i]; break;
default :
if(pr[j-1]==INF)
ec[j-1].nr*=10,
ec[j-1].nr+=(int)s[i]-48;
else
pr[j]=INF,
ec[j++].nr=(int)s[i]-48;
break;
}
c=creare_arb(0,j-1,ec,pr);
calc(c);
fout<<c->nr;
return 0;
}