Cod sursa(job #2787743)

Utilizator Teodor94Teodor Plop Teodor94 Data 23 octombrie 2021 22:46:47
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.43 kb
#include <stdio.h>
#include <string.h>

#define MAX_S 100000

char s[MAX_S];
int n;
int sIndex;

int factors[MAX_S];
int factorsSize;

char operators[MAX_S];
int operatorsSize;

void pushOperator(char op) {
  if (op == '*' || op == '/' || op == '+' || op == '-' || op == '(' || op == ')')
    operators[operatorsSize++] = op;
}
char popLastOperator() {
  return operatorsSize ? operators[--operatorsSize] : '+';
}
char lastOperator() {
  return operatorsSize ? operators[operatorsSize - 1] : '+';
}

bool hasFactors() {
  return factorsSize > 0;
}
void pushFactor(int factor) {
  factors[factorsSize++] = factor;
}
int lastFactor() {
  return factorsSize ? factors[factorsSize - 1] : 0;
}
int popLastFactor() {
  return factorsSize ? factors[--factorsSize] : 0;
}

int factor() {
  int number;

  number = 0;
  while (s[sIndex] >= '0' && s[sIndex] <= '9') {
    number = number * 10 + s[sIndex] - '0';
    ++sIndex;
  }

  return number;
}

int main() {
  FILE *fin, *fout;
  fin = fopen("evaluare.in", "r");
  fout = fopen("evaluare.out", "w");

  int result;
  char op;

  fgets(s, MAX_S, fin);
  n = strlen(s);

  sIndex = 0;
  pushOperator('+');
  while (sIndex < n) {
    while (s[sIndex] == '(') {
      pushOperator('(');
      pushOperator('+');
      ++sIndex;
    }

    op = lastOperator();
    if (op == '*') {
      pushFactor(popLastFactor() * factor());
      popLastOperator();
    } else if (op == '/') {
      pushFactor(popLastFactor() / factor());
      popLastOperator();
    } else if (op == '+' || op == '-')
      pushFactor(factor());

    while (s[sIndex] == ')') {
      result = 0;
      op = popLastOperator();
      while (op != '(') {
        if (op == '+')
          result += popLastFactor();
        else
          result -= popLastFactor();

        op = popLastOperator();
      }

      if (lastOperator() == '*') {
        result = popLastFactor() * result;
        popLastOperator();
      } else if (lastOperator() == '/') {
        result = popLastFactor() / result;
        popLastOperator();
      }

      pushFactor(result);

      ++sIndex;
    }

    pushOperator(s[sIndex++]);
  }

  result = 0;
  while (hasFactors()) {
    if (popLastOperator() == '+')
      result += popLastFactor();
    else
      result -= popLastFactor();
  }

  fprintf(fout, "%d\n", result);

  fclose(fin);
  fclose(fout);
  return 0;
}