#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX_LUNGIME 100005
typedef struct Nod
{
int esteOperator;
char operator;
int valoare;
struct Nod *stanga, *dreapta;
} Nod;
char expresie[MAX_LUNGIME];
int pozitie;
Nod* creeazaNodValoare(int valoare)
{
Nod* nod = (Nod*)malloc(sizeof(Nod));
nod->esteOperator = 0;
nod->valoare = valoare;
nod->stanga = nod->dreapta = NULL;
return nod;
}
Nod* creeazaNodOperator(char operator, Nod* stanga, Nod* dreapta)
{
Nod* nod = (Nod*)malloc(sizeof(Nod));
nod->esteOperator = 1;
nod->operator = operator;
nod->stanga = stanga;
nod->dreapta = dreapta;
return nod;
}
void sareSpatii()
{
while (expresie[pozitie] == ' ') pozitie++;
}
int citesteNumar()
{
sareSpatii();
int valoare = 0;
while (isdigit(expresie[pozitie]))
{
valoare = valoare * 10 + (expresie[pozitie] - '0');
pozitie++;
}
return valoare;
}
Nod* parseazaExpresie();
Nod* parseazaFactor()
{
sareSpatii();
if (expresie[pozitie] == '(')
{
pozitie++;
Nod* nod = parseazaExpresie();
sareSpatii();
pozitie++;
return nod;
} else {
return creeazaNodValoare(citesteNumar());
}
}
Nod* parseazaTermen()
{
Nod* nod = parseazaFactor();
while (1) {
sareSpatii();
if (expresie[pozitie] == '*' || expresie[pozitie] == '/')
{
char op = expresie[pozitie++];
Nod* dreapta = parseazaFactor();
nod = creeazaNodOperator(op, nod, dreapta);
}
else
break;
}
return nod;
}
Nod* parseazaExpresie()
{
Nod* nod = parseazaTermen();
while (1) {
sareSpatii();
if (expresie[pozitie] == '+' || expresie[pozitie] == '-')
{
char op = expresie[pozitie++];
Nod* dreapta = parseazaTermen();
nod = creeazaNodOperator(op, nod, dreapta);
}
else
break;
}
return nod;
}
int evalueaza(Nod* nod)
{
if (!nod->esteOperator) return nod->valoare;
int stanga = evalueaza(nod->stanga);
int dreapta = evalueaza(nod->dreapta);
switch (nod->operator)
{
case '+': return stanga + dreapta;
case '-': return stanga - dreapta;
case '*': return stanga * dreapta;
case '/': return stanga / dreapta;
}
return 0; // fallback
}
void elibereazaArbore(Nod* nod)
{
if (!nod) return;
elibereazaArbore(nod->stanga);
elibereazaArbore(nod->dreapta);
free(nod);
}
int main()
{
FILE* fin = fopen("evaluare.in", "r");
FILE* fout = fopen("evaluare.out", "w");
fgets(expresie, MAX_LUNGIME, fin);
pozitie = 0;
Nod* radacina = parseazaExpresie();
int rezultat = evalueaza(radacina);
fprintf(fout, "%d\n", rezultat);
elibereazaArbore(radacina);
fclose(fin);
fclose(fout);
return 0;
}