Cod sursa(job #1749719)

Utilizator matzul98Socaciu Mihai matzul98 Data 28 august 2016 17:09:11
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.97 kb
#include <iostream>//Evalueaza o expresie cu semnele -,+,*,/,(,)
#include <fstream>
#include <stack>
#include <string>
using namespace std;
/* Exemple
(1+1)*13+10/2 = 31

1234*567-(789+678*(456+78)) = 336837
*/

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

int applyOperator(int a, int b, char c)
{
   //Daca c este + atunci return a + b
   switch(c)
   {
      case '+':
         return a+b;
         break;
      case '-':
         return a-b;
         break;
      case '*':
         return a*b;
         break;
      default:
         return a/b;
   }
}

bool isOperator(char c)
{
   if(c=='+' || c=='-' || c=='*' || c=='/') return true;
   return false;
}

bool arePrioritate(char a, char b)
{
   //Are prioritate mai mare sau egala ultimul din stack (a) decat cel curent (b)
   if(a=='+' || a=='-')
      if(b=='+' || b=='-') return true;

   if(a=='*' || a=='/') return true;
   return false;
}

void Calcul(string s)
{
   //Calculam expresia din postfix in rezultatul final
   stack<int> st2;
   int numar = 0;

   for(int i=0; i < s.size(); i++)
   {
      if(isdigit(s[i]))
      {
         numar = numar*10 + (s[i] - '0');

      }
      if(s[i]==' ')
      {
         //Daca in expresie e numar , il adaugam in stiva
         //Dupa fiecare numar avem spatiu
         st2.push(numar);

         numar = 0;
      }

      if(isOperator(s[i]))
      {
         //Scoatem ultimele 2 din stiva si aplicam operator, apoi adaugam rezultatul
         int temp2 = st2.top();
         st2.pop();
         int temp1 = st2.top();
         st2.pop();

         st2.push(applyOperator(temp1,temp2,s[i]));
      }
   }
   g<<st2.top();
}

void RPN(string s)
{
   //Convertim din infix in postfix
   stack<char> st;
   string res;//Rezultatul
   string numar;

   for(int i = 0; i < s.size(); i++)
   {
      if(isdigit(s[i]))
      {
         numar += s[i];
      }
      else
      {
         //Dam de operator -> am avut un numar inainte
         if(numar != "") res += numar + " ";
         numar = "";

         if(isOperator(s[i]))
         {
            //Cand are prioritate mai mare se adauga
            while( !st.empty() && arePrioritate(st.top(),s[i]) && st.top()!='(')
            {
               res += st.top() ;
               st.pop();
            }
            st.push(s[i]);
         } else
            //In caz de paranteze
            if(s[i]=='(') st.push(s[i]);
         else
            if(s[i]==')')
            {
               while(!st.empty() && st.top()!='(')
               {
                  res += st.top();
                  st.pop();
               }
               st.pop();
            }
      }
   }

   //Ramane intotdeauna ceva in stiva
   if(numar != "") res += numar + " ";

   while( !st.empty() )
   {
      res += st.top() ;
      st.pop();

   }
   //Etapa finala
   Calcul(res);
}

int main()
{
   string s;
   getline(f,s);
   RPN(s);
}