Mai intai trebuie sa te autentifici.

Cod sursa(job #1818798)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 29 noiembrie 2016 20:36:04
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.82 kb
#include <fstream>
#include <iostream>

using namespace std;


ifstream in ("evaluare.in");
ofstream out ("evaluare.out");


int const nmax = 100000;


char line[nmax];


struct Symbol {
  char op; //'@'
  int priority;
  long number;
};


Symbol infix[nmax], postfix[nmax];
int infixp = 0, postfixp = 0;


void pushto(Symbol s, Symbol *exp, int &pointer) {
  exp[pointer] = {s.op, s.priority, s.number};
  pointer++;
}


void chartoinfix(char *vec){
  int i = 0 , nr = 0;
  bool startno = 0;
  while(vec[i]!= '\0') {
    if('0' <= vec[i] && vec[i] <= '9'){
      nr = nr * 10 + vec[i]-'0';
      startno = 1;
    } else{
      if (startno == 1){
       pushto({'@', 0, nr}, infix, infixp);
       startno = 0;
      }
     nr = 0;
     if(vec[i] == '(' || vec[i] == ')'){
       pushto({vec[i], 0, 0}, infix, infixp);
     } else if(vec[i] == '+' || vec[i] == '-'){
       pushto({vec[i], 2, 0}, infix, infixp);
     } else {
       pushto({vec[i], 3, 0}, infix, infixp);
     }
    }
    i++;
  }
  if (startno == 1){
    pushto({'@', 0, nr}, infix, infixp);
    startno = 0;
    nr = 0;
  }
}

Symbol stack[nmax];

void infixtopostfix(Symbol *vec, int &vecp, Symbol *rez, int &rezp){
  int pointer = 0;
  for(int i=0; i<vecp; i++) {
    if(vec[i].op == '@')
      pushto(vec[i], rez, rezp);
    else{
      if(vec[i].op == '('){
        pushto(vec[i] , stack , pointer);
      }
      else if(vec[i].op == ')') {
       while(stack[pointer-1].op != '(') {
          pushto(stack[pointer-1] ,rez ,rezp);
          pointer--;
        }
        pointer--;
      }else if(stack[pointer - 1].priority < vec[i].priority) {
        pushto(vec[i] , stack , pointer);
      } else{
        while(vec[i].priority <= stack[pointer - 1].priority){
          pushto(stack[pointer-1], rez, rezp);
          pointer--;
        }
        pushto(vec[i], stack, pointer);

      }
    }
  }
  while(pointer>0){
    pushto(stack[pointer-1], rez, rezp);
    pointer--;
  }
}


long evalpostfix(Symbol *vec, int vecp) {
  long stack[nmax];
  int pointer = 0;
  for(int i = 0; i < vecp; i++){
    if(vec[i].op == '@'){
      stack[pointer] = vec[i].number;
      pointer++;
    } else{
      if(vec[i].op == '+')
        stack[pointer - 2] = stack[pointer - 2] + stack[pointer - 1];
      else  if(vec[i].op == '-')
        stack[pointer - 2] = stack[pointer - 2] - stack[pointer - 1];
      else  if(vec[i].op == '*')
        stack[pointer - 2] = stack[pointer - 2] * stack[pointer - 1];
      else  if(vec[i].op == '/')
        stack[pointer - 2] = stack[pointer - 2] / stack[pointer - 1];
      pointer--;
    }
  }
  return stack[0];
}


int main(){
  in>>line;
  chartoinfix(line);
  infixtopostfix(infix, infixp, postfix, postfixp);
  out<<evalpostfix(postfix,  postfixp);
}