Pagini recente » Cod sursa (job #2890871) | Cod sursa (job #2442285) | Cod sursa (job #3193964) | Cod sursa (job #2893533) | Cod sursa (job #2615375)
#include <fstream>
#include <cstring>
#include <cstdlib>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
int vp[100005], n, aux, st[50005], rez;
char s[100005];
struct ex
{
char op[15];
}e[100005];
struct nod
{
char op[15];
nod *st, *dr;
};
nod *rad;
void creare (nod *&q, int li, int ls)
{
int mini, poz, i;
mini=vp[ls];
poz=ls;
for (i=ls-1; i>=li; i--)
{
if (vp[i]<mini)
{
mini=vp[i];
poz=i;
}
}
q=new nod;
strcpy(q->op, e[poz].op); ///introduc nodul de pe pozitia poz in arbore
if (li==ls)
{
q->st=q->dr=NULL;
}
else
{
creare(q->st, li, poz-1);
creare(q->dr, poz+1, ls);
}
}
void SDR (nod *q)
{
if (q!=NULL)
{
SDR(q->st);
SDR(q->dr);
strcpy(e[aux].op, q->op); ///copiez in e[] expresia in forma poloneza
aux++;
}
}
int main()
{
int i, k, nr, z, niv;
fin.get(s, 100005);
n=strlen(s);
k=0;
nr=0;
for (i=0; i<n; i++)
{
switch(s[i])
{
case '(': {
k=k+10;
}; break;
case ')': {
k=k-10;
}; break;
case '+': {
vp[nr]=k+1;
e[nr].op[0]=s[i];
nr++;
}; break;
case '-': {
vp[nr]=k+1;
e[nr].op[0]=s[i];
nr++;
}; break;
case '*': {
vp[nr]=k+10;
e[nr].op[0]=s[i];
nr++;
}; break;
case '/': {
vp[nr]=k+10;
e[nr].op[0]=s[i];
nr++;
}; break;
default : {
z=0;
while (s[i]>='0' && s[i]<='9')
{
e[nr].op[z]=s[i];
z++;
i++;
}
vp[nr]=1000;
nr++;
i--;
}; break;
}
}
creare(rad, 0, nr-1);
SDR(rad);
niv=0;
rez=0;
for (i=0; i<aux; i++)
{
if (e[i].op[0]>='0' && e[i].op[0]<='9')
{
st[niv]=atoi(e[i].op);
niv++;
}
else
{
niv--;
if (e[i].op[0]=='+')
rez=st[niv-1]+st[niv];
else
{
if (e[i].op[0]=='-')
rez=st[niv-1]-st[niv];
else
{
if (e[i].op[0]=='*')
rez=st[niv-1]*st[niv];
else
rez=st[niv-1]/st[niv];
}
}
niv--;
st[niv]=rez;
niv++;
}
}
fout<<st[0];
fin.close();
fout.close();
return 0;
}