Cod sursa(job #1906676)

Utilizator bogdanboboc97Bogdan Boboc bogdanboboc97 Data 6 martie 2017 15:42:44
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 3.04 kb
#include <fstream>
#include <string>
#include <stack>
#include <vector>
#include <typeinfo>
#include <cstring>

template<typename DataType>
class Calculator{
    private:
        std::stack< char > Operators;
        std::stack< DataType > Numbers;
    public:
        DataType convert(std::string x)
        {
            //DataType y;
            if(strcmp(typeid(DataType).name(),"double")==0)
                return std::stod(x);
            if(strcmp(typeid(DataType).name(),"float")==0)
                return std::stof(x);
            return std::stoi(x);
        }

        int priority(char x)
        {
            if(x=='+' || x=='-')
                return 1;
            if(x=='*' || x=='/' || x=='%')
                return 2;
            return 0;
        }

        void solveOp()
        {
            int nr2=Numbers.top();
            Numbers.pop();
            int nr1=Numbers.top();
            Numbers.pop();
            char x=Operators.top();
            Operators.pop();
            if(x=='+')
                Numbers.push(nr1+nr2);
            if(x=='-')
                Numbers.push(nr1-nr2);
            if(x=='*')
                Numbers.push(nr1*nr2);
            if(x=='/')
                Numbers.push(nr1/nr2);
            if(x=='%')
                Numbers.push(nr1%nr2);
        }

        DataType solve(std::string exp)
        {
            Numbers=std::stack< DataType >();
            Operators=std::stack< char >();

            std::vector< std::string > v;
            std::string s;

            for(size_t i=0;i<exp.size();i++)
            {
                if((exp[i]>='0' && exp[i]<='9') || exp[i]=='.')
                    s.push_back(exp[i]);
                else{
                    if(s.size())
                        v.push_back(s);
                    v.push_back( std::string("")+=exp[i] );
                    s.clear();
                }
            }
            if(s.size())
            {
                v.push_back(s);
                s.clear();
            }

            for(size_t i=0;i<v.size();i++)
            {
                if(v[i][0]=='(')
                    Operators.push( v[i][0] );
                else if(v[i][0]==')')
                {
                    while(Operators.top()!='(')
                        solveOp();
                    Operators.pop();
                }
                else{

                    if(priority(v[i][0]))
                    {
                        while(!Operators.empty() && priority(Operators.top()) >= priority(v[i][0]))
                            solveOp();
                        Operators.push(v[i][0]);
                    }
                    else
                        Numbers.push( std::stoi(v[i]) );
                }
            }
            while(!Operators.empty())
                solveOp();
            return Numbers.top();
        }
};

int main()
{
    Calculator<double> calc;

    std::ifstream in("evaluare.in");

    std::string eq;
    in>>eq;
    in.close();

    std::ofstream out("evaluare.out");
    out<<calc.solve(eq)<<'\n';
    out.close();

    return 0;
}