Pagini recente » Cod sursa (job #684992) | Cod sursa (job #1863874) | Cod sursa (job #1624107) | Cod sursa (job #2685907) | Cod sursa (job #1974721)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <cstring>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
#define pb push_back
#define ll long long
const int strMax = 1e5 + 5;
const int lvlMax = 2;
// se construieste arborele expresiei fara transformarea in forma postfixata
// vezi sursa 5
int N;
char str[strMax],*p;
const char lvlOp[2][3] = {'+','-','\0','*','/','\0'};
struct nod {
int nr;
char c;
nod *st,*dr;
nod(int _nr = 0,char _c = '\0',nod *_st = nullptr,nod *_dr = nullptr) {
nr = _nr;
c = _c;
st = _st;
dr = _dr;
}
};
nod* eval(int);
int compute(nod*);
//
// compute(n) = numarul asociat nodului daca este un numar
// sau = rezultatul operatiei asociate nodului altfel
int main() {
in>>(str);
p = str;
nod *root = eval(0);
out<<compute(root)<<'\n';
in.close();out.close();
return 0;
}
nod* eval(int lvl) {
nod *ans;
if (lvl == lvlMax) {
if (*p == '(') {
++p;
ans = eval(0);
++p;
}
else {
int nr = 0;
while ('0' <= *p && *p <= '9') {
nr = nr * 10 + (*p++ - '0');
}
ans = new nod(nr);
}
}
else {
for(ans = eval(lvl+1); strchr(lvlOp[lvl],*p) != nullptr && *strchr(lvlOp[lvl],*p) != '\0'; ) {
char op = *p++;
ans = new nod(0,op,ans,eval(lvl+1));
}
}
return ans;
}
int compute(nod *n) {
switch (n->c) {
case '+': return compute(n->st) + compute(n->dr);
case '-': return compute(n->st) - compute(n->dr);
case '*': return compute(n->st) * compute(n->dr);
case '/': return compute(n->st) / compute(n->dr);
default: return n->nr;
}
}