#ifndef __CALCULATIONFORMULA_HEAD__
#define __CALCULATIONFORMULA_HEAD__
#include <iostream>
#include <stack>
#include <cstdio>
#include <string>
#include <cstdio>
using namespace std;
class CalculatiomFormula
{
public:
CalculatiomFormula(string _formula)
{
s1 = _formula+"=";
s2 = "";
}
//得到结果
static double getValueByStr(string _formula)
{
CalculatiomFormula* pCalculatiomFormula = new CalculatiomFormula(_formula);
pCalculatiomFormula->deal();
double reslut = pCalculatiomFormula->countt();
return reslut;
}
private:
string s1,s2;
stack<char> s;
stack<double> c;
public:
void init()
{
while(!s.empty())
s.pop();
while(!c.empty())
c.pop();
}
int pro(char ch)
{
switch(ch)
{
case '+':
case '-':return 1;
case '*':
case '/':return 2;
default :return 0;
}
}
void deal()
{
init();
int i=0,len=s1.length();
s.push('#');
while(i<len-1)
{
if(s1[i]=='(')
s.push(s1[i++]);
else if(s1[i]==')')
{
while(s.top()!='(')
{
s2+=s.top();
s2+=' ';
s.pop();
}
s.pop();
i++;
}
else if(s1[i]=='+'||s1[i]=='-'||s1[i]=='*'||s1[i]=='/')
{
while(pro(s.top())>=pro(s1[i]))
{
s2+=s.top();
s2+=' ';
s.pop();
}
s.push(s1[i]);
i++;
}
else
{
while(s1[i]<='9' && s1[i]>='0'||s1[i]=='.')
s2+=s1[i++];
s2+=' ';
}
}
while(s.top()!='#')
{
s2+=s.top();
s.pop();
s2+=' ';
}
}
double countt()
{
int len=s2.length(),i=0;
double y,x;
while(i<len)
{
if(s2[i]==' ')
i++;
else
{
switch(s2[i])
{
case '+':x=c.top();c.pop();x+=c.top();c.pop();i++;break;
case '-':x=c.top();c.pop();x=c.top()-x;c.pop();i++;break;
case '*':x=c.top();c.pop();x*=c.top();c.pop();i++;break;
case '/':x=c.top();c.pop();x=c.top()/x;c.pop();i++;break;
default :
{
x=0.0;
while(s2[i]<='9'&&s2[i]>='0')
x=x*10+(s2[i++]-'0');
if(s2[i]=='.')
{
i++;
double k=10.0;y=0.0;
while(s2[i]<='9'&&s2[i]>='0')
{
y+=(s2[i++]-'0')/k;
k*=10;
}
x+=y;
}
}
}
c.push(x);
}
}
return c.top();
}
};
#endif // __CALCULATIONFORMULA_HEAD__