/////////////////////////////////////////////////////////////////////////// // 作者: 游侠UFO // 时间: 2008年月日 // 版本: 1.1 // 备注: 需包含头文件<string>、<stack>;表达式(strExp)需以'='结束。 ///////////////////////////////////////////////////////////////////////////
long Evaluate(const string &strExp)
{
stack<size_t> stkiOptr;
stack<long> stklOpnd;
long lAns=0;
size_t iOptr=6, Index=0;
string strOpnd, strOptrTable="+-*/()=";
int iOperator[7][7]={
{2, 2, 0, 0, 0, 2, 2},
{2, 2, 0, 0, 0, 2, 2},
{2, 2, 2, 2, 0, 2, 2},
{2, 2, 2, 2, 0, 2, 2},
{0, 0, 0, 0, 0, 1,-1},
{2, 2, 2, 2,-1, 2, 2},
{0, 0, 0, 0, 0,-1, 1} };
stkiOptr.push(6);
stklOpnd.push(0);
while (strExp[Index]!='=' || iOptr!=6)
{
if (48<=strExp[Index] && strExp[Index]<=57) strOpnd.push_back(strExp[Index++]);
else
{
size_t iTemp, iOptrTemp;
if ((iTemp=strOptrTable.find(strExp[Index]))!=string::npos)
{
if (!strOpnd.empty())
{
stklOpnd.push(atoi(strOpnd.data()));
strOpnd="";
}
iOptrTemp=iTemp;
iOptr=stkiOptr.top();
switch (iOperator[iOptr][iOptrTemp])
{
case 0:
stkiOptr.push(iOptrTemp);
Index++;
break;
case 1:
iOptr=stkiOptr.top();
stkiOptr.pop();
Index++;
break;
case 2:
long a, b;
iOptrTemp=stkiOptr.top();
stkiOptr.pop();
b=stklOpnd.top();
stklOpnd.pop();
a=stklOpnd.top();
stklOpnd.pop();
switch (iOptrTemp)
{
case 0:
stklOpnd.push(a+b);
break;
case 1:
stklOpnd.push(a-b);
break;
case 2:
stklOpnd.push(a*b);
break;
case 3:
stklOpnd.push(a/b);
break;
}
break;
}
}
}
iOptr=stkiOptr.top();
}
lAns=stklOpnd.top();
stklOpnd.pop();
return lAns;
}