Cod sursa(job #2536741)

Utilizator sygAndreiIonitaIonita Andrei sygAndreiIonita Data 2 februarie 2020 16:55:53
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <stack>
#include <cctype>
#include <deque>

using namespace std; 

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

stack <short int> s;
deque < pair <long long,bool> > fin;
stack <long long> r;

// ( = 0;
// - = 1;
// + = 2;
// * = 3;
// / = 4;

int main()
{
  char c,aux='a';
  long long cnt=0,nr=0,x1,x2,rez;
  while (in.get(c)&&c!='\n')
  {
    if (isdigit(c)&&isdigit(aux))
      nr=nr*10+c-48;
    else if (isdigit(c)&&!isdigit(aux))
      nr=c-48;
    else if (!isdigit(c)&&isdigit(aux))
      fin.push_back({nr,0});
    if (!isdigit(c))
    {
      if (c=='+'||c=='-')
      {
        while (!s.empty()&&s.top())
          fin.push_back({s.top(),1}),s.pop();
        if (c=='+')
          s.push(2);
        else
          s.push(1); 
      }   
      else if (c=='*'||c=='/')
      {
        while (!s.empty()&&s.top()>=3)
          fin.push_back({s.top(),1}),s.pop();
        if (c=='*')
          s.push(3);
        else
          s.push(4);
      }
      else if (c=='(')
        s.push(0);  
      else
      {
        while (!s.empty()&&s.top()!=0)
          fin.push_back({s.top(),1}),s.pop();
        s.pop();
      }
    }
    aux=c;
  }
  if (isdigit(aux))
    fin.push_back({nr,0});
  while (!s.empty())
    fin.push_back({s.top(),1}),s.pop();
  for (int i=0;i<fin.size();i++)
  {
    if (fin[i].second==0)
      r.push(fin[i].first);
    else
    {
      x1=r.top(),r.pop(),x2=r.top(),r.pop();
      if (fin[i].first==1)
        rez=x2-x1;
      else if (fin[i].first==2)
        rez=x2+x1;
      else if (fin[i].first==3)
        rez=x2*x1;
      else
        rez=x2/x1;
      r.push(rez);
    }
  }
  out<<r.top();
  return 0;
}