Pagini recente » Cod sursa (job #1864688) | Cod sursa (job #2421636) | Cod sursa (job #2415986) | Cod sursa (job #333694) | Cod sursa (job #3241348)
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
#define nl '\n'
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
string expresie;
stack<char> ops;
stack<int> numbers;
vector<char> RPN;
int priority[256];
int calculate(int a, int b, char op)
{
if (op == '+')
return a+b;
else if (op == '-')
return a-b;
else if (op == '*')
return a*b;
else if (op == '/')
return a/b;
return 0;
}
void evaluate(int i)
{
if (i == expresie.size())
{
while (!ops.empty())
{
RPN.push_back(ops.top());
int b = numbers.top();
numbers.pop();
int a = numbers.top();
numbers.pop();
numbers.push(calculate(a, b, ops.top()));
ops.pop();
}
return;
}
if ('0' <= expresie[i] && expresie[i] <= '9')
{
int number = 0;
while ('0' <= expresie[i] && expresie[i] <= '9')
{
RPN.push_back(expresie[i]);
number = number*10+expresie[i++]-'0';
}
numbers.push(number);
i--;
}
else if (expresie[i] == '(')
ops.push(expresie[i]);
else if (expresie[i] == ')')
{
while (ops.top() != '(')
{
RPN.push_back(ops.top());
int b = numbers.top();
numbers.pop();
int a = numbers.top();
numbers.pop();
numbers.push(calculate(a, b, ops.top()));
ops.pop();
}
ops.pop();
}
else
{
while (!ops.empty() && priority[expresie[i]] <= priority[ops.top()])
{
RPN.push_back(ops.top());
int b = numbers.top();
numbers.pop();
int a = numbers.top();
numbers.pop();
numbers.push(calculate(a, b, ops.top()));
ops.pop();
}
ops.push(expresie[i]);
}
evaluate(i+1);
}
int main()
{
priority['+'] = priority['-'] = 1;
priority['*'] = priority['/'] = 2;
fin >> expresie;
evaluate(0);
fout << numbers.top();
return 0;
}