Pagini recente » Cod sursa (job #2865579) | Cod sursa (job #1529217) | Cod sursa (job #1606982) | Cod sursa (job #3284534) | Cod sursa (job #1107881)
#include <string>
#include <vector>
#include <fstream>
using namespace std;
const int ADD = -1, SUB = -2, MUL = -3, DIV = -4, LP = -5, RP = -6;
string s;
vector<int> tokens;
vector<int>::iterator p;
inline bool is_digit(char c) {
return c >= '0' && c <= '9';
}
void tokenize() {
for(int i = 0; i < (int) s.size(); ++i) {
if(s[i] == '+') tokens.push_back(ADD);
else if(s[i] == '-') tokens.push_back(SUB);
else if(s[i] == '*') tokens.push_back(MUL);
else if(s[i] == '/') tokens.push_back(DIV);
else if(s[i] == '(') tokens.push_back(LP);
else if(s[i] == ')') tokens.push_back(RP);
else {
int x = 0;
while(is_digit(s[i])) {
x = x * 10 + (int) (s[i] - '0');
i++;
}
tokens.push_back(x);
i--;
}
}
}
int eval();
int termen();
int factor();
int factor() {
int x = *p;
++p;
if(x == LP) {
x = eval();
++p;
}
return x;
}
int termen() {
int r = factor();
while(p != tokens.end() && (*p == MUL || *p == DIV)) {
int op = *p;
++p;
if(op == MUL) {
r *= factor();
}
if(op == DIV) {
r /= factor();
}
}
return r;
}
int eval() {
int r = termen();
while(p != tokens.end() && (*p == ADD || *p == SUB)) {
int op = *p;
++p;
if(op == ADD) {
r += termen();
}
if(op == SUB) {
r -= termen();
}
}
return r;
}
int main(int argc, char *argv[]) {
ifstream fi("evaluare.in");
ofstream fo("evaluare.out");
fi >> s;
tokenize();
p = tokens.begin();
int result = eval();
fo << result << endl;
fo.close();
return 0;
}