Pagini recente » Cod sursa (job #868367) | Cod sursa (job #582114) | Cod sursa (job #1943899) | Cod sursa (job #277630) | Cod sursa (job #1354312)
#include <iostream>
#include <fstream>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
int lookahead = 0;
int eval_F(const string& s);
int eval_E(const string& s);
int eval_A(const string& s);
int eval_T(const string& s) {
if(lookahead >= s.size()) return 0;
int res_F = eval_F(s);
while(1) {
int sign = 0;
if(s[lookahead] == '+') sign = 1;
else if(s[lookahead] == '-') sign = -1;
if(!sign) break;
lookahead++;
res_F += sign * eval_F(s);
}
return res_F;
}
int eval_F(const string& s) {
if(lookahead >= s.size()) return 0;
int res_A = eval_A(s);
while(1) {
int sign = 0;
if(s[lookahead] == '*') sign = 1;
else if(s[lookahead] == '/') sign = -1;
if(!sign) break;
lookahead++;
if(sign > 0) res_A *= eval_A(s);
else res_A /= eval_A(s);
}
return res_A;
}
int match_number(const string& s) {
int res = 0;
while(lookahead < s.size() && '0' <= s[lookahead] && s[lookahead] <= '9') {
res = res * 10 + s[lookahead] - '0';
lookahead++;
}
return res;
}
int eval_A(const string& s) {
if(lookahead >= s.size()) return 0;
if('0' <= s[lookahead] && s[lookahead] <= '9') {
return match_number(s);
} else if(s[lookahead] == '(') {
lookahead++;
int res_E = eval_E(s);
lookahead++;
return res_E;
}
return 0;
}
int eval_E(const string& s) {
return eval_T(s);
}
int main() {
string exp;
in >> exp;
out << eval_E(exp);
return 0;
}