Pagini recente » Cod sursa (job #259122) | Cod sursa (job #164728) | Cod sursa (job #1397884) | Cod sursa (job #1169609) | Cod sursa (job #2773261)
#include <fstream>
#include <cstring>
#include <cctype>
const int MAX_LEN = 100001;
const int MAX_LEVEL = 2;
char expression[MAX_LEN] = { 0 };
char* iter = expression;
char op[3][3] = { "+-", "*/", "" };
int result;
struct node {
int value;
char op;
node* left;
node* right;
node() {
value = 0;
op = 0;
left = nullptr;
right = nullptr;
}
};
void read()
{
std::ifstream input("evaluare.in");
input >> expression;
input.close();
}
void print()
{
std::ofstream output("evaluare.out");
output << result << '\n';
output.close();
}
node* build(int level)
{
node* n;
if (level == MAX_LEVEL) {
if (*iter == '(') {
++iter;
n = build(0);
++iter;
} else {
int value(0);
while (std::isdigit(*iter)) {
value = value * 10 + (*iter - '0');
++iter;
}
n = new node;
n->value = value;
}
} else {
n = build(level + 1);
while (*iter && std::strchr(op[level], *iter)) {
node* oper = new node;
oper->op = *iter;
oper->left = n;
++iter;
oper->right = build(level + 1);
n = oper;
}
}
return n;
}
int eval(node* expr)
{
if (expr->op == '+') {
return eval(expr->left) + eval(expr->right);
} else if (expr->op == '-') {
return eval(expr->left) - eval(expr->right);
} else if (expr->op == '*') {
return eval(expr->left) * eval(expr->right);
} else if (expr->op == '/') {
return eval(expr->left) / eval(expr->right);
} else {
return expr->value;
}
}
int main()
{
read();
node *expr = build(0);
result = eval(expr);
print();
return 0;
}