Cod sursa(job #2773261)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 5 septembrie 2021 22:54:41
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#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;
}