Pagini recente » Cod sursa (job #851983) | Cod sursa (job #928595) | Cod sursa (job #559124) | Cod sursa (job #2467989) | Cod sursa (job #1906676)
#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;
}