Pagini recente » Monitorul de evaluare | Cod sursa (job #2012154)
#include <bits/stdc++.h>
#define DIM 100005
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char str[DIM];
vector<int>numbers;
vector<char>operators;
int getPriority(char ch)
{
switch (ch)
{
case '(' : return 0; break;
case ')' : return 1; break;
case '+' : return 2; break;
case '-' : return 2; break;
case '*' : return 3; break;
case '/' : return 3; break;
default:
return -1;
}
}
int doMath(int a, char op, int b)
{
switch (op)
{
case '+' : return a + b;
case '-' : return a - b;
case '*' : return a * b;
case '/' : return a / b;
default:
return 0;
}
}
int doStuff(const char sir[])
{
int aux1, aux2;
for (int i = 0; sir[i] ; ++i)
if (getPriority(sir[i]) == -1) // number
{
int aux = 0;
for (; getPriority(sir[i]) == -1 && sir[i]; aux = aux * 10 + (sir[i] - '0'), ++i);
--i;
numbers.push_back(aux);
}
else
if (getPriority(sir[i]) == 0 )
operators.push_back(sir[i]);
else
if (getPriority(sir[i]) == 1)
{
for (; operators.back() != '('; aux2 = numbers.back(), numbers.pop_back(),
aux1 = numbers.back(), numbers.pop_back(),
numbers.push_back(doMath(aux1, operators.back(), aux2)),
operators.pop_back());
operators.pop_back();
}
else // +-/* case
{
while( operators.size() && numbers.size() >= 2 && getPriority(operators.back()) >= getPriority(sir[i]) )
{
aux2 = numbers.back(), numbers.pop_back(),
aux1 = numbers.back(), numbers.pop_back(),
numbers.push_back(doMath(aux1, operators.back(), aux2));
operators.pop_back();
}
operators.push_back(sir[i]);
}
for (; operators.size() ; aux2 = numbers.back(), numbers.pop_back(),
aux1 = numbers.back(), numbers.pop_back(),
numbers.push_back(doMath(aux1, operators.back(), aux2)),
operators.pop_back());
return numbers[0];
}
int main()
{
fin >> str;
fout << doStuff(str);
return 0;
}