Pagini recente » Cod sursa (job #316612) | Cod sursa (job #507988) | Cod sursa (job #2853973) | Cod sursa (job #2233397) | Cod sursa (job #2871491)
#include <fstream>
#include <string>
using namespace std;
string::iterator findPair(string::iterator pos)
{
int count = 1;
if (*pos == '(')
{
while (count)
{
++pos;
if (*pos == '(')
++count;
if (*pos == ')')
--count;
}
}
if (*pos == ')')
{
while (count)
{
--pos;
if (*pos == '(')
--count;
if (*pos == ')')
++count;
}
}
return pos;
}
int eval(string::iterator left, string::iterator right)
{
for(auto it = right-1; it > left; --it)
{
if (*it == ')' && it!= right-1 )
{
it = findPair(it);
if (it == left)
break;
}
if (*it == '+' || *it == '-')
{
auto lft = it;
if (*(lft - 1) == ')' && left == findPair(lft - 1))
{
++left;
--lft;
}
auto rht = it + 1;
if (*rht == '(' && right - 1 == findPair(rht))
{
--right;
++rht;
}
if (*it == '+')
return eval(left, lft) + eval(rht, right);
else
return eval(left, lft) - eval(rht, right);
}
}
for (auto it = right - 1; it > left; --it)
{
if (*it == ')' && it!= right-1)
{
it = findPair(it);
if (it == left)
break;
}
if (*it == '*' || *it == '/')
{
auto lft = it;
if (*(lft - 1) == ')' && left == findPair(lft - 1))
{
++left;
--lft;
}
auto rht = it + 1;
if (*rht == '(' && right - 1 == findPair(rht))
{
--right;
++rht;
}
if (*it == '*')
return eval(left, lft) * eval(rht, right);
else
return eval(left, lft) / eval(rht, right);
}
}
int res = 0;
for (auto it = left; it != right; ++it)
res = res * 10 + (* it - 48);
return res;
}
int main()
{
ifstream in("evaluare.in");
string expr;
in >> expr;
in.close();
ofstream out("evaluare.out");
auto beg = expr.begin();
auto end = expr.end();
out << eval(beg, end);
out.close();
return 0;
}