Cod sursa(job #3233036)

Utilizator thomascrusaderSandu Edward thomascrusader Data 2 iunie 2024 12:06:26
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.85 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stack>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
class PrecedentaOperator
{
public:
    static int precedenta(char op)
{
    if(op=='+' || op=='-')
        return 1;
    if(op=='*' || op=='/')
        return 2;
    else
        return 0;

}
};
class Operatie
{
public:
    static int operatii(int n,int m, char c)
{
    if(c=='+')
        return n+m;
    if(c=='-')
        return n-m;
    if(c=='*')
        return n*m;
    if(c=='/')
        return n/m;
}
};
class Evaluari
{
public:
    static int evaluare(string expresie)
{
    int i;
    stack<int>valoare;
    stack<char>operanzi;
    int x=expresie.length();
    for(i=0;i<x;i++)
    {
        if(expresie[i]==' ')
        continue;
        if(expresie[i]=='(')
        {
            operanzi.push(expresie[i]);
        }
        else
        if(isdigit(expresie[i]))
        {
            int val=0;
            while(i<x&& isdigit(expresie[i]))
            {
                val=(val*10)+(expresie[i]-'0');
                i++;
            }
            valoare.push(val);
            i--;
        }
        else
        if(expresie[i]==')')
        {
            while(!operanzi.empty() && operanzi.top()!='(')
            {
                int val2=valoare.top();
                valoare.pop();
                int val1=valoare.top();
                valoare.pop();
                char op=operanzi.top();
                operanzi.pop();
                valoare.push(Operatie::operatii(val1,val2,op));
            }
            if(!operanzi.empty())
                operanzi.pop();
        }
        else
        {
            while(!operanzi.empty() && PrecedentaOperator::precedenta(operanzi.top())>=PrecedentaOperator::precedenta(expresie[i]))
            {
                int val2=valoare.top();
                valoare.pop();
                int val1=valoare.top();
                valoare.pop();
                char op=operanzi.top();
                operanzi.pop();
                valoare.push(Operatie::operatii(val1,val2,op));
            }
            operanzi.push(expresie[i]);
        }
    }
    while(!operanzi.empty())
    {
        int val2=valoare.top();
        valoare.pop();
        int val1=valoare.top();
        valoare.pop();
        char op=operanzi.top();
        operanzi.pop();
        valoare.push(Operatie::operatii(val1,val2,op));
    }
    return valoare.top();
}

};
class CitireAfis
{

public:
    static string citire()
    {
        string sir;
        getline(fin,sir);
        return sir;
    }
    static void afisare(string sir)
    {
        fout<<Evaluari::evaluare(sir);
    }
};
int main()
{
    CitireAfis::afisare(CitireAfis::citire());
    return 0;
}