Cod sursa(job #1106609)

Utilizator danny794Dan Danaila danny794 Data 12 februarie 2014 22:22:50
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include <cstdio>

using namespace std;

const int NMAX = 100005;

char expr[NMAX];
char char_stack[NMAX];
int number_stack[NMAX],number_pointer = 0, char_pointer = 0;

void read() {
  freopen("evaluare.in", "r", stdin);
  freopen("evaluare.out", "w", stdout);
  scanf("%s", expr);
}

void compute_operation(int sp) {
  number_pointer--;
  switch (char_stack[sp]) {
    case ('*'):
      number_stack[number_pointer] *= number_stack[number_pointer + 1];
      break;
    case ('/'):
      number_stack[number_pointer] /= number_stack[number_pointer + 1];
      break;
    case ('+'):
      number_stack[number_pointer] += number_stack[number_pointer + 1];
      break;
    case ('-'):
      number_stack[number_pointer] -= number_stack[number_pointer + 1];
      break;
  }
  char_pointer--;
  char_stack[sp] = char_stack[sp + 1];
}

bool reduce() {
  if( char_pointer > 0 ) {
    if( char_stack[char_pointer] == ')' ) {
      if( char_stack[char_pointer - 1] == '(' ) {
        char_pointer -= 2;
        return true;
      }
      compute_operation(char_pointer - 1);
      return true;
    } else if ( char_stack[char_pointer] == '(' )
        return false;
      else {
        if( char_pointer > 1 ) {
          if ( char_stack[char_pointer - 1] == '*' || char_stack[char_pointer - 1] == '/' ) {
            compute_operation(char_pointer - 1);
            return true;
          } else if( (char_stack[char_pointer] == '+' || char_stack[char_pointer] == '-') &&
              (char_stack[char_pointer - 1] != '(' && char_stack[char_pointer - 1] != ')')){
            compute_operation(char_pointer - 1);
            return true;
          }
        }

        return false;
      }
  }
  return false;
}

void solve() {
  int i = 0;
  while(expr[i] != '\0') {
    if(expr[i] < '0' || expr[i] > '9') {
      char_stack[++char_pointer] = expr[i];
    } else {
      int n = 0;
      while(expr[i] >= '0' && expr[i] <= '9') {
        n = n * 10 + (expr[i] - '0');
        i++;
      }
      i--;
      number_stack[++number_pointer] = n;
    }
    while(reduce())
      ;
    i++;
  }
  while(char_pointer > 0)
    compute_operation(char_pointer);
}

int main() {
  read();
  solve();
  printf("%d", number_stack[number_pointer]);
  return 0;
}