Pagini recente » Cod sursa (job #1450500) | Cod sursa (job #1364723) | Cod sursa (job #1471022) | Cod sursa (job #1494646) | Cod sursa (job #3268677)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
string expr;
ifstream fin("evaluator.in");
ofstream fout("evaluator.out");
bool paranteze(int st, int dr)
{
if (expr[st] == '(' && expr[dr] == ')')
{
int cnt = 0;
for (int i = st; i <= dr; ++i)
{
if (expr[i] == '(')
cnt++;
else if (expr[i] == ')')
cnt--;
if (cnt == 0 && i < dr)
return false;
}
return true;
}
return false;
}
int solve(int st, int dr)
{
if (st > dr)
return 0;
if (paranteze(st, dr))
return solve(st + 1, dr - 1);
int level = 0;
for (int i = dr; i >= st; i--)
{
if (expr[i] == ')')
level++;
else if (expr[i] == '(')
level--;
else if (level == 0 && (expr[i] == '+' || expr[i] == '-'))
{
int left = solve(st, i - 1);
int right = solve(i + 1, dr);
return expr[i] == '+' ? left + right : left - right;
}
}
level = 0;
for (int i = dr; i >= st; i--)
{
if (expr[i] == ')')
level++;
else if (expr[i] == '(')
level--;
else if (level == 0 && (expr[i] == '*' || expr[i] == '/'))
{
int left = solve(st, i - 1);
int right = solve(i + 1, dr);
return expr[i] == '*' ? left * right : left / right;
}
}
int num = 0;
for (int i = st; i <= dr; ++i) {
if (isdigit(expr[i])) num = num * 10 + (expr[i] - '0');
}
return num;
}
int evaluate(string s)
{
expr = s;
return solve(0, expr.size() - 1);
}
int main()
{
string s;
fin >> s;
fout << evaluate(s);
return 0;
}