Pagini recente » Cod sursa (job #373905) | Cod sursa (job #2782194) | Cod sursa (job #2873720) | Borderou de evaluare (job #2235334) | Cod sursa (job #2871499)
#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)
{
if(*(right-1) == ')' && findPair(right-1) == left)
{
--right;
++left;
}
for(auto it = right-1; it > left; --it)
{
if (*it == ')')
{
it = findPair(it);
if (it == left)
break;
}
if (*it == '+' || *it == '-')
{
auto lft = it;
auto rht = it + 1;
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;
auto rht = it + 1;
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");
out << eval(expr.begin(), expr.end());
out.close();
return 0;
}