Pagini recente » Cod sursa (job #670082) | Cod sursa (job #1944386) | Cod sursa (job #2076777) | Cod sursa (job #2802826) | Cod sursa (job #3241349)
#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> nrsss;
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 = nrsss.top();
nrsss.pop();
int a = nrsss.top();
nrsss.pop();
nrsss.push(calculate(a, b, ops.top()));
ops.pop();
}
return;
}
if ('0' <= expresie[i] && expresie[i] <= '9')
{
int nr = 0;
while ('0' <= expresie[i] && expresie[i] <= '9')
{
RPN.push_back(expresie[i]);
nr = nr*10+expresie[i++]-'0';
}
nrsss.push(nr);
i--;
}
else if (expresie[i] == '(')
ops.push(expresie[i]);
else if (expresie[i] == ')')
{
while (ops.top() != '(')
{
RPN.push_back(ops.top());
int b = nrsss.top();
nrsss.pop();
int a = nrsss.top();
nrsss.pop();
nrsss.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 = nrsss.top();
nrsss.pop();
int a = nrsss.top();
nrsss.pop();
nrsss.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 << nrsss.top();
return 0;
}