Pagini recente » Cod sursa (job #505969) | Istoria paginii utilizator/pavelescu_anca_maria_324ca | Monitorul de evaluare | Cod sursa (job #984328) | Cod sursa (job #1977584)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
#define pb push_back
#define ll long long
const int NMax = 1e5 + 5;
const int lvlMax = 2;
const char lvlOp[2][3] = {{'+','-','\0'},{'*','/','\0'}};
char str[NMax],*p = str;
struct nodArb {
int nr;
char op;
nodArb *st,*dr;
nodArb (int _nr = 0,char _op = '\0',nodArb *_st = 0,nodArb *_dr = 0) {
nr = _nr;
op = _op;
st = _st;
dr = _dr;
}
};
nodArb *eval(int);
int compute(nodArb*);
int main()
{
in>>(str);
nodArb *root = eval(0);
out<<compute(root)<<'\n';
in.close();out.close();
return 0;
}
nodArb *eval(int lvl) {
nodArb *ans = 0;
//cout<<(p - str + 1)<<' '<<lvl<<'\n';
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 nodArb(nr);
}
}
else {
for (ans = eval(lvl+1); *p != '\0' && strchr(lvlOp[lvl],*p);) {
char op = *p++;
ans = new nodArb(0,op,ans,eval(lvl+1));
}
}
//cout<<(p - str + 1)<<' '<<lvl<<' '<<ans<<'\n';
return ans;
}
int compute(nodArb* nod) {
nodArb *x,*y;
x = nod -> st;
y = nod -> dr;
switch(nod -> op) {
case '+': return compute(x) + compute(y);
case '-': return compute(x) - compute(y);
case '*': return compute(x) * compute(y);
case '/': return compute(x) / compute(y);
default: return nod -> nr;
}
}