Cod sursa(job #1747425)

Utilizator matzul98Socaciu Mihai matzul98 Data 24 august 2016 21:24:15
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.81 kb
#include <iostream>//Evalueaza o expresie cu semnele -,+,*,/,(,)
#include <fstream>
#include <stack>
#include <string>
using namespace std;
/* Exemple
(1+1)*13+10/2

*/

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]);
      }

      //In caz de paranteze
      if(s[i]=='(') st.push(s[i]);

      if(s[i]==')')
      {

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

      }
   }

   //Ramane intotdeauna ceva in stiva
   res += numar + " ";
   while( !st.empty() )
   {
      res += st.top() ;

      st.pop();

   }

   //Etapa finala
   Calcul(res);
}

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

   RPN(s);
}