Cod sursa(job #2787797)

Utilizator Teodor94Teodor Plop Teodor94 Data 24 octombrie 2021 01:09:03
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.38 kb
#include <stdio.h>
#include <string.h>

#define MAX_S 100000

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();                              // Elimin ultima valoare
  a = popFactor();                              // Elimin penultima valoare
  pushFactor(compute(a, b, popOperator()));     // Adauga rezultatul dintre ele si elimin operatorul
}

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");

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

  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();

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

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