Cod sursa(job #2615590)
Utilizator | Iliescu Alexia iliescualexia | Data | 14 mai 2020 22:21:37 |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 90 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 3.8 kb |
#include <fstream>
#include <cstring>
#include <iostream>
using namespace std;
ifstream fi("evaluare.in");
ofstream fo("evaluare.out");
struct nod{ char op[10];
nod *st, *dr;
};
char sir[100010],expr[100010][10],c;
int vectpri[100010], vp[100010],el,x,m,k; /// prioritate k +10 (
/// -10 )
/// +1 +
/// +1 -
/// +10 *
/// +10 /
nod *rad;
nod* creare_arb(int li, int ls)
{
nod *q;
int i, j, minim;
minim = vectpri[ls];
i = ls;
for(j=ls; j>=li; j--)
{
if(vectpri[j] < minim)
{
minim = vectpri[j];
i = j;
}
}
q = new nod;
strcpy(q->op,expr[i]);
if(li == ls)
q->st = q->dr = NULL;
else
{ q->st=creare_arb(li,i-1);
q->dr=creare_arb(i+1,ls);
}
return q;
}
void SDR(nod *q)
{
if(q != NULL)
{
SDR(q->st);
SDR(q->dr);
if(q->op[0]>='0'&&q->op[0]<='9')
{
k=0;
el=0;
while(q->op[k]>='0'&&q->op[k]<='9')
{
x=q->op[k]-48;
el=el*10+x;
k++;
}
m++;
vp[m]=el;
}
else
{
if(q->op[0]=='+')
{
x=vp[m]+vp[m-1];
m--;
vp[m]=x;
}
else
{
if(q->op[0]=='*')
{
x=vp[m]*vp[m-1];
m--;
vp[m]=x;
}
else
{
if(q->op[0]=='-')
{
x=vp[m-1]-vp[m];
m--;
vp[m]=x;
}
else
{
x=vp[m-1]/vp[m];
m--;
vp[m]=x;
}
}
}
}
}
}
int main()
{ int i, j, k, n;
k = 0; /// in k memorez prioritatile
fi.get(sir,100010); /// a*(b+c)-e/(a+d)+h
n = strlen(sir);
k=0;
for(i=0; i<n; i++)
{
switch(sir[i])
{
case ')': {
k = k - 10;
};break;
case '(': {
k = k + 10;
};break;
case '+': {
vp[i] = k + 1;
};break;
case '-': {
vp[i] = k + 1;
};break;
case '*': {
vp[i] = k + 10;
};break;
case '/': {
vp[i] = k + 10;
};break;
default: {
vp[i]=1000;
while(sir[i]>='0'&&sir[i]<='9')
{
i++;
}
i--;
}
}
}
j=0;
for(i=0; i<n; i++)
{
if(sir[i] !=')' && sir[i] !='(')
{
if(sir[i]>='0'&&sir[i]<='9')
{
k=0;
vectpri[j] = vp[i];
while(sir[i]>='0'&&sir[i]<='9'&&i<n)
{
expr[j][k]=sir[i];
k++;
i++;
}
i--;
}
else
{
expr[j][0] = sir[i];
vectpri[j] = vp[i];
}
j++;
}
}
rad = creare_arb(0,j-1);
m=0;
SDR(rad);
fo<<vp[1];
fi.close();
fo.close();
return 0;
}