Cod sursa(job #2456608)

Utilizator Catalin2002Catalin Craciun Catalin2002 Data 14 septembrie 2019 20:37:56
Problema Evaluarea unei expresii Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.33 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;

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,y;

    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()!='('||x==')'))
            {
                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.get(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=y-x;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();
}

int main()
{
    citire();

    fout << calculare();

    return 0;
}