Pagini recente » Cod sursa (job #2252778) | Cod sursa (job #2416135) | Cod sursa (job #2228236) | Cod sursa (job #1414502) | Cod sursa (job #2791688)
#include <fstream>
#include <string.h>
#define MAX_S 100000
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
char s[MAX_S];
int n;
int sIndex;
char operators[MAX_S];
int operatorsSize;
int factors[MAX_S];
int factorsSize;
int priority(char op)
{
if (op == '*' || op == '/')
return 2;
if (op == '+' || op == '-')
return 1;
return 0;
}
void pushOperator(char op)
{
if (op == '*' || op == '/' || op == '+' || op == '-' || op == '(' || op == ')')
operators[operatorsSize++] = op;
}
char popOperator()
{
return operatorsSize ? operators[--operatorsSize] : '\0';
}
char topOperator()
{
return operatorsSize ? operators[operatorsSize - 1] : '\0';
}
bool hasOperators()
{
return operatorsSize > 0;
}
void pushFactor(int factor)
{
factors[factorsSize++] = factor;
}
int popFactor()
{
return factorsSize ? factors[--factorsSize] : 0;
}
int compute(int a, int b, char op)
{
int result;
result = 0;
if (op == '*')
result = a * b;
else if (op == '/')
result = a / b;
else if (op == '+')
result = a + b;
else if (op == '-')
result = a - b;
return result;
}
void computeTop()
{
int a, b;
b = popFactor();
a = popFactor();
pushFactor(compute(a, b, popOperator()));
}
int factor()
{
int number;
number = 0;
while (s[sIndex] >= '0' && s[sIndex] <= '9')
{
number = number * 10 + s[sIndex] - '0';
++sIndex;
}
return number;
}
int main()
{
cin.get(s,MAX_S);
n = strlen(s);
sIndex = 0;
sIndex = 0;
while (sIndex < n)
{
if (s[sIndex] >= '0' && s[sIndex] <= '9')
pushFactor(factor());
else if (s[sIndex] == '(')
pushOperator(s[sIndex++]);
else if (s[sIndex] == ')')
{
while (topOperator() != '(')
computeTop();
popOperator();
++sIndex;
}
else if (priority(s[sIndex]))
{
while (priority(topOperator()) && priority(topOperator()) >= priority(s[sIndex]))
computeTop();
pushOperator(s[sIndex++]);
}
else
++sIndex;
}
while (hasOperators())
computeTop();
cout<<popFactor();
return 0;
}