Pagini recente » Cod sursa (job #2886638) | Cod sursa (job #2665517) | Cod sursa (job #35214) | Cod sursa (job #2740104) | Cod sursa (job #2890505)
#include <iostream>
#include <fstream>
#include <stack>
std::ifstream fin("evaluare.in");
std::ofstream fout("evaluare.out");
int priority(char op)
{
if (op == '+' || op == '-') return 1;
else if (op == '*' || op == '/') return 2;
return 0;
}
int applyOperator(int a, int b, char op)
{
switch (op)
{
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
}
}
int expressionEvaluate(std::string s)
{
std::stack<int> val;
std::stack<char> op;
int len = s.length(), i;
for (i = 0; i < len; ++i)
{
if (s[i] == ' ') continue;
if (s[i] == '(') op.push(s[i]);
else if (isdigit(s[i]))
{
int number = 0;
while (i < len && isdigit(s[i]))
{
number = (number * 10) + (s[i] - '0');
i++;
}
val.push(number);
i--;
}
else if (s[i] == ')')
{
while (!op.empty() && op.top() != '(')
{
char ch = op.top();
op.pop();
int x = val.top();
val.pop();
int y = val.top();
val.pop();
int z = applyOperator(y, x, ch);
val.push(z);
}
if (!op.empty()) op.pop();
}
else
{
while (!op.empty() && priority(op.top()) >= priority(s[i]))
{
int x = val.top();
val.pop();
int y = val.top();
val.pop();
char opr = op.top();
op.pop();
val.push(applyOperator(y, x, opr));
}
op.push(s[i]);
}
}
while (!op.empty())
{
int x = val.top();
val.pop();
int y = val.top();
val.pop();
char opr = op.top();
op.pop();
val.push(applyOperator(y, x, opr));
}
return val.top();
}
int main()
{
std::string expression;
fin >> expression;
fout << expressionEvaluate(expression);
}