Cod sursa(job #2452722)

Utilizator Catalin2002Catalin Craciun Catalin2002 Data 31 august 2019 23:38:51
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.65 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;

const int nrmax=1000000005;

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

queue <int> numere;
stack <char> semne;

stack <int> calcul;

bool comparatie(char a,char b)
{
    if((b=='*'||b=='/')&&(a=='+'||a=='-'))
        return true;

    return false;
}

void citire()
{
    char x,sem;



    fin.get(x);

    while(x!='\n')
    {
        if(!semne.empty())
         sem=semne.top();

        if(isdigit(x))
        {
            int nr=0;
            while(isdigit(x))
            {
                nr=nr*10+x-'0';
                fin.get(x);
            }

            numere.push(nr);
        }
        else
        {
         if(!semne.empty()&&semne.top()!='(')
        {
            if(x=='(')
             {
                 semne.push(x);
             }
            else
            if(comparatie(semne.top(),x))
                semne.push(x);
            else
            {

                while(!semne.empty()&&semne.top()!='(')
                {
                    switch (semne.top())
                      {
                          case '+' : numere.push(-1); break;

                          case '-' : numere.push(-2); break;

                          case '*' : numere.push(-3); break;

                          case '/' : numere.push(-4); break;

                          default : break;


                      }

                    semne.pop();

                    if(!semne.empty())
                    sem=semne.top();

                }

                if(!semne.empty())
                    semne.pop();

                if(x!=')')
                    semne.push(x);

            }




        }
        else
        {
            semne.push(x);
        }



        fin>>x;
        }


    }


    while(!semne.empty()&&semne.top()!='(')
                {
                    switch (semne.top())
                      {
                          case '+' : numere.push(-1); break;

                          case '-' : numere.push(-2); break;

                          case '*' : numere.push(-3); break;

                          case '/' : numere.push(-4); break;

                          default : break;


                      }

                    semne.pop();

                    if(!semne.empty())
                    sem=semne.top();

                }






}

int calculare()
{
    int x,y,c,nr;

    while(!numere.empty())
    {
        nr=numere.front();

        if(numere.front()>=0)
            {
                calcul.push(numere.front());
                c=calcul.top();
            }
        else
        {
            switch (numere.front())
            {
                case -1: x=calcul.top(); calcul.pop();y=calcul.top();calcul.pop();x=x+y;calcul.push(x);break;
                case -2: x=calcul.top(); calcul.pop();y=calcul.top();calcul.pop();x=x-y;calcul.push(x);break;
                case -3: x=calcul.top(); calcul.pop();y=calcul.top();calcul.pop();x=x*y;calcul.push(x);break;
                case -4: x=calcul.top(); calcul.pop();y=calcul.top();calcul.pop();x=y/x;calcul.push(x);break;
            }

            c=calcul.top();
        }
        numere.pop();


    }

    return calcul.top();
}

void scriere()
{
    while(!numere.empty())
        {
            fout<<numere.front()<<" ";
            numere.pop();
        }
}

int main()
{
    citire();

    ///scriere();

    //cout<<"\n";

    fout<<calculare();

    return 0;
}