Cod sursa(job #2037932)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 12 octombrie 2017 23:04:57
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <deque>
#include <cstring>

using namespace std;

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

deque <char> Op;
deque <int> Val;

int Prioritate(char c)
{
   if(strchr("*/",c)) return 2;
   if(strchr("+-",c)) return 1;
}

bool isOperator(char c)
{
  if(strchr("+-*/",c)) return 1;

  return 0;
}

void Do()
{
  int a,b;

  b=Val.back();
  Val.pop_back();

  a=Val.back();
  Val.pop_back();

  if(Op.back()=='+') Val.push_back(a+b);
  if(Op.back()=='*') Val.push_back(a*b);
  if(Op.back()=='/') Val.push_back(a/b);
  if(Op.back()=='-') Val.push_back(a-b);

  Op.pop_back();
}


void Read()
{
  char x,last;
  int nr=0;

  while(fin>>x)
  {
    if(isdigit(x))
      { if(nr==-1) nr=x-'0';
        else nr=nr*10+(int)(x-'0');
      }
    else { if(nr>-1) Val.push_back(nr);
           //fout<<nr<<' ';
           nr=-1;
         }
    if(x=='(') Op.push_back(x);
    if(x==')')
    {
      while(Op.back()!='(') Do();

      Op.pop_back();
    }
    if(isOperator(x))
      { while(!Op.empty() && Op.back()!='(')
          if(Prioritate(Op.back())>=Prioritate(x))
            Do();
          else break;
        Op.push_back(x);
      }
      last=x;
  }
  if(isdigit(last)) Val.push_back(nr);

  while(!Op.empty()) Do();
}

void Print()
{
  fout<<Val.back()<<'\n';
  fout.close();
}

int main()
{
    Read();
    Print();

    return 0;
}