Pagini recente » Cod sursa (job #2545144) | Cod sursa (job #2517121) | Cod sursa (job #3122603) | Cod sursa (job #639213) | Cod sursa (job #2961970)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
struct Nod
{
char* informatie;
struct Nod *st, *dr;
};
/*
char* SetUpConstruiesteArbore(char *s)
{
int n = strlen(s), m, i, j, x, cx;
char* Operatori = "()+-*^/|&";
char* Raspuns;
j = 0;
for(i = 0; i < n; i++) if(s[i] != ' ') s[j++] = s[i];
s[j] = '\n', n = j;
for(i = 0; i < n; i++)
{
if(strchr(Operatori, s[i]) != nullptr) Raspuns += s[i];
else if(s[i] < '0' || s[i] > 9)
{
char* nume = "";
while(i < n && s[i] != '.' && strcmp(Operatori, s[i]) == nullptr)
{
nume += s[i];
i++;
}
cx = x = getIntVal(nume);
while(cx)
{
cx /= 10;
Raspuns += '0';
}
m = strlen(R), j = 0;
while(x)
{
R[m-1-j] += x % 10;
x /= 10;
j++;
}
}
}
return Raspuns;
}
*/
int Prioritate(char Operator)
{
if(Operator == '+' || Operator == '-') return 1;
else if(Operator == '/' || Operator == '*') return 2;
}
struct Nod* ConstruiesteArbore(char* s)
{
int n = int(strlen(s)), i, j, capat1 = -1, capat2 = -1;
struct Nod *s1[100005], *s2[100005];
for(i = 0; i < n; i++)
{
if(s[i] >= '0' && s[i] <= '9')
{
j = i;
while(j < n && s[j] >= '0' && s[j] <= '9') j++;
if(j < n && s[j] == '.')
{
while(j < n && s[j] >= '0' && s[j] <= '9') j++;
}
s1[++capat1] = (struct Nod*) (malloc(sizeof(struct Nod)));
s1[capat1]->informatie = new char[j-i+1], s1[capat1]->st = nullptr, s1[capat1]->dr = nullptr;
j = i;
while(j < n && s[j] >= '0' && s[j] <= '9')
{
s1[capat1]->informatie[j-i] = s[j];
j++;
}
if(j < n && s[j] == '.')
{
s1[capat1]->informatie[j-i] = '.';
while(j < n && s[j] >= '0' && s[j] <= '9')
{
s1[capat1]->informatie[j-i] = s[j];
j++;
}
}
s1[capat1]->informatie[j-i] = '\n';
i = j - 1;
}
else if(s[i] == '(')
{
s2[++capat2] = (struct Nod*) (malloc(sizeof(struct Nod)));
s2[capat2]->informatie = new char[2], s2[capat2]->st = nullptr, s2[capat2]->dr = nullptr;
s2[capat2]->informatie[0] = '(', s2[capat2]->informatie[1] = '\n';
}
else if(s[i] == ')')
{
while(s2[capat2]->informatie[0] != '(')
{
capat1--;
s2[capat2]->st = s1[capat1], s2[capat2]->dr = s1[capat1+1];
s1[capat1] = s2[capat2];
capat2--;
}
capat2--;
}
else
{
while(capat2 != -1 && s2[capat2]->informatie[0] != '(' && Prioritate(s2[capat2]->informatie[0]) >= Prioritate(s[i]))
{
capat1--;
s2[capat2]->st = s1[capat1], s2[capat2]->dr = s1[capat1+1];
s1[capat1] = s2[capat2];
capat2--;
}
s2[++capat2] = (struct Nod*) (malloc(sizeof(struct Nod)));
s2[capat2]->informatie = new char[2], s2[capat2]->st = nullptr, s2[capat2]->dr = nullptr;
s2[capat2]->informatie[0] = s[i], s2[capat2]->informatie[1] = '\n';
}
}
while(capat2 != -1)
{
capat1--;
s2[capat2]->st = s1[capat1], s2[capat2]->dr = s1[capat1+1];
s1[capat1] = s2[capat2];
capat2--;
}
return s1[capat1];
}
int Eval(struct Nod* rad)
{
if(strcmp(rad->informatie, "+\n") == 0) return Eval(rad->st) + Eval(rad->dr);
else if(strcmp(rad->informatie, "-\n") == 0) return Eval(rad->st) - Eval(rad->dr);
else if(strcmp(rad->informatie, "*\n") == 0) return Eval(rad->st) * Eval(rad->dr);
else if(strcmp(rad->informatie, "/\n") == 0) return Eval(rad->st) / Eval(rad->dr);
return atoi(rad->informatie);
}
int main()
{
char*s = new char[100005];
fin.getline(s, 100005);
struct Nod* Radacina = ConstruiesteArbore(s);
fout << Eval(Radacina);
return 0;
}
/*
70*(1071/(9291110/1696+276875)*4059+1106990)
77489300
*/