#include <string>
#include "DataType.h"
#include "NumType.h"
using namespace std;
nums compute(string sInfix)
{
string sSuffix;
sSuffix.clear();
stack<char>aChar;
int iL=sInfix.length(),iI=0;
while (iI<iL)
{
if ((isdigit(sInfix.at(iI)))||(sInfix.at(iI)=='.'))
{
while ((iI<iL)&&((isdigit(sInfix.at(iI)))||(sInfix.at(iI)=='.')))
{
sSuffix.append(1,sInfix.at(iI++));
}
iI--;
sSuffix.append(1,',');
}
if (sInfix.at(iI)=='(')
{
aChar.push('(');
}
if (sInfix.at(iI)==')')
{
while (aChar.top()!='(')
{
sSuffix.append(1,aChar.pop());
}
aChar.pop();
}
if ((sInfix.at(iI)=='-')&&((iI==0)||(!isdigit(sInfix.at(iI-1)))))
{
sSuffix.append(1,'_');
}
else if ((sInfix.at(iI)=='+')||(sInfix.at(iI)=='-')||(sInfix.at(iI)=='*')||(sInfix.at(iI)=='/'))
{
while (vs(sInfix.at(iI))<=vs(aChar.top()))
{
sSuffix.append(1,aChar.pop());
}
aChar.push(sInfix.at(iI));
}
iI++;
}
while (!aChar.empty())
{
sSuffix.append(1,aChar.pop());
}
iI=0;
iL=sSuffix.length();
stack <nums> aNums;
while (iI<iL)
{
if (isdigit(sSuffix.at(iI)))
{
long iJ=0,iAt=iI,iT=1,iNum=0,iFlag=0;
nums nT;
while (sSuffix.at(iI)!=',')
{
if (isdigit(sSuffix.at(iI)))
{
if (iFlag==0)
{
iNum=iNum*10+sSuffix.at(iI++)-'0';
}
else
{
iNum=iNum*10+sSuffix.at(iI++)-'0';
iJ++;
}
}
else if (sSuffix.at(iI)=='.')
{
iFlag=1;
iI++;
}
}
if (iAt>0)
{
if (sSuffix.at(iAt-1)=='_')
{
iNum=-iNum;
}
}
if (iJ>0)
{
for (iAt=1;iAt<=iJ;iAt++)
{
iT*=10;
}
}
nT.record(iNum,iT);
aNums.push(nT);
}
if (sSuffix.at(iI)=='+')
{
nums nT1,nT2,nT3;
nT1=aNums.pop();
nT2=aNums.pop();
nT3=nT1+nT2;
aNums.push(nT3);
}
if (sSuffix.at(iI)=='-')
{
nums nT1,nT2,nT3;
nT1=aNums.pop();
nT2=aNums.pop();
nT3=nT2-nT1;
aNums.push(nT3);
}
if (sSuffix.at(iI)=='*')
{
nums nT1,nT2,nT3;
nT1=aNums.pop();
nT2=aNums.pop();
nT3=nT1*nT2;
aNums.push(nT3);
}
if (sSuffix.at(iI)=='/')
{
nums nT1,nT2,nT3;
nT1=aNums.pop();
nT2=aNums.pop();
nT3=nT2/nT1;
aNums.push(nT3);
}
iI++;
}
return aNums.pop();
}