Pagini recente » Monitorul de evaluare | Cod sursa (job #38575) | Cod sursa (job #1778270) | Cod sursa (job #570815) | Cod sursa (job #950130)
Cod sursa(job #950130)
#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 chr;
int i,j,n,pr[DMAX],nr,rez;
nod *creare_arb(int ls,int ld)
{
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);
c->dr=creare_arb(pminn+1,ld);
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;
}
}
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()
{
chr=fin.get();
do
{
switch (chr)
{
case ')': nr-=10; break;
case '(': nr+=10; break;
case '+': pr[j]=nr+1; ec[j++].op=chr; break;
case '-': pr[j]=nr+1; ec[j++].op=chr; break;
case '*': pr[j]=nr+10; ec[j++].op=chr; break;
case '/': pr[j]=nr+10; ec[j++].op=chr; break;
default :
if(pr[j-1]==INF)
ec[j-1].nr*=10,
ec[j-1].nr+=(int)chr-48;
else
pr[j]=INF,
ec[j++].nr=(int)chr-48;
break;
}
chr=fin.get();
}while(chr!='\n');
c=creare_arb(0,j-1);
//calc(c);
fout<<c->nr;
return 0;
}