Cod sursa(job #1814500)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 24 noiembrie 2016 08:43:54
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.84 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in ("evaluare.in");
ofstream out ("evaluare.out");
int const NMAX = 100002;
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){
        if(opstack[oppointer - 1]/2 <= opstack[oppointer - 2]/2 ){
          numpointer--;
          sum(opstack[oppointer - 2]);
          numstack[numpointer - 1] = numstack[numpointer];
          opstack[oppointer - 2] = opstack[oppointer - 1];
          oppointer--;
        } else{
          sum(opstack[oppointer - 1]);
          oppointer--;
          numpointer--;
        }
      }
      oppointer--;
  } else {
      sum(opstack[oppointer - 1]);
      numpointer--;
      opstack[oppointer-1] = op;
  }

}

void reducestaks(){
  while(oppointer > 0){
    if(opstack[oppointer - 1]/2 <= opstack[oppointer - 2]/2 ){
          numpointer--;
          sum(opstack[oppointer - 2]);
          numstack[numpointer - 1] = numstack[numpointer];
          opstack[oppointer - 2] = opstack[oppointer - 1];
          oppointer--;
        } else{
          sum(opstack[oppointer - 1]);
          oppointer--;
          numpointer--;
        }
  }
}
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;
}