Cod sursa(job #1814204)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 23 noiembrie 2016 19:05:28
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in ("evaluare.in");
ofstream out ("evaluare.out");
int const NMAX = 100000;
int numstack[NMAX];
int opstack[NMAX];
int oppointer = 0 ,numpointer = 0;


///functie de calcul pentru operatori + ,- ,* ,/
void sum(int nr){
  if(nr == 2)
    numstack[numpointer - 2] = numstack[numpointer - 2] - numstack[numpointer - 1];
  if(nr == 3)
    numstack[numpointer - 2] = numstack[numpointer - 2] + numstack[numpointer - 1];
  if(nr == 4)
    numstack[numpointer - 2] = numstack[numpointer - 2] * numstack[numpointer - 1];
  if(nr == 5)
    numstack[numpointer - 2] = numstack[numpointer - 2] / numstack[numpointer - 1];
}


void procesnumber(int nr){
  numstack[numpointer] = nr;
  numpointer++;
}


void procesoperator(int op){
  /// daca 1.stiva e goala sau 2. operatorul e paranteza deschisa
  /// 3.operatorul are prioritate mai mare decat cea a opertorului precedent e pus in stiva

  if(oppointer == 0 || op == 0 || opstack[oppointer - 1] / 2 < op / 2){
    opstack[oppointer] = op;
    oppointer++;

  } else if(op == 1){

    while(opstack[oppointer - 1] != 0){
      sum(opstack[oppointer - 1]);
      numpointer--;
      oppointer--;
    }
    oppointer--;
  } else {
      sum(opstack[oppointer - 1]);
      numpointer--;
      opstack[oppointer-1] = op;
  }
}

void reducestaks(){
  while(oppointer > 0){
    sum(opstack[oppointer - 1]);
    numpointer--;
    oppointer--;
  }
}
int main(){
  int nr = 0;
  char c = 0;
  bool ok = 0;
  while(in>>c){
    if(c >= '0' && c <= '9'){
      nr = nr * 10 + (c - '0');
      ok = 1;
    }
    else{
      if(ok){
        procesnumber(nr);
      }
      ok = 0;
      nr = 0;
      ///catul impartiri la 2 e prioritatea
      if(c == '-')
        procesoperator(2);
      else if(c == '+')
        procesoperator(3);
      else if(c == '*')
        procesoperator(4);
      else if(c == '/')
        procesoperator(5);
      else if(c == '(')
        procesoperator(0);
      else if(c == ')')
        procesoperator(1);
    }
  }
  if(ok)
    procesnumber(nr);
  if(oppointer > 0){
    reducestaks();
  }
  out<<numstack[numpointer-1];
  return 0;
}