Pagini recente » Cod sursa (job #276118) | Cod sursa (job #1445756) | Cod sursa (job #1875194) | Cod sursa (job #733164) | Cod sursa (job #1975490)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
#define pb push_back
const int strMax = 1e6 + 5;
const int lvlMax = 2;
const char lvlOp[2][3] = {'+','-','\0','*','/','\0'};
int N;
char str[strMax],*p;
struct arbNode {
int nr;
char op;
arbNode *st,*dr;
arbNode(int _nr = 0,int _op = '\0',arbNode *_st = nullptr,arbNode *_dr = nullptr) {
nr = _nr;
op = _op;
st = _st;
dr = _dr;
}
};
arbNode *eval(int);
int compute(arbNode*);
int main() {
in>>(str);
p = str;
arbNode *root = eval(0);
out<<compute(root)<<'\n';
in.close();out.close();
return 0;
}
arbNode *eval(int lvl) {
arbNode *ans = 0;
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 arbNode(nr);
}
}
else {
for (ans = eval(lvl+1); *p != '\0' && strchr(lvlOp[lvl],*p) != nullptr; ) {
char op = *p++;
ans = new arbNode(0,op,ans,eval(lvl+1));
}
}
return ans;
}
int compute(arbNode* node) {
switch (node -> op) {
case '+': return compute(node -> st) + compute(node -> dr);
case '-': return compute(node -> st) - compute(node -> dr);
case '*': return compute(node -> st) * compute(node -> dr);
case '/': return compute(node -> st) / compute(node -> dr);
default: return (node -> nr);
}
}