Cod sursa(job #2791688)

Utilizator GargantuanRoOprea Rares GargantuanRo Data 30 octombrie 2021 22:21:02
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.39 kb
#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;
}