四则混合运算,输入不带空格的字符串。返回结果存放在rValue中
可以使用+-*/和(),正负数前可以带符号
struct _data
{
int dataType;
CString szData;
double num;
};
BOOL GetArithmeticResult(const CString &m_szStrIn, double& rValue) // rValue存放结果
{
// 拆分字符串
enum {LOW = 0, OPE = 1, OPEL = 2, OPEH = 3, DATA = 4};
std::queue <struct _data> d1;
struct _data temp;
temp.szData = _T("");
temp.dataType = DATA;
int length = m_szStrIn.GetLength();
temp.szData += CString(m_szStrIn[0]);
for (int i = 1; i < length; ++i)
{
if ('*' == m_szStrIn[i] || '/' == m_szStrIn[i]
|| '+' == m_szStrIn[i] || '-' == m_szStrIn[i]
|| '(' == m_szStrIn[i] || ')' == m_szStrIn[i]
)
{
if (!temp.szData.IsEmpty())
{
d1.push(temp);
temp.szData.Empty();
}
struct _data tt;
tt.szData = CString(m_szStrIn[i]);
if ( '+' == m_szStrIn[i] || '-' == m_szStrIn[i])
{
tt.dataType = OPEL;
}
else if ('(' == m_szStrIn[i] || ')' == m_szStrIn[i])
{
tt.dataType = OPE;
}
else
{
tt.dataType = OPEH;
}
d1.push(tt);
if (i+1 < length && ')' != m_szStrIn[i]
&& ('-' == m_szStrIn[i+1] || '+' == m_szStrIn[i+1]))
{
temp.szData += m_szStrIn[i+1];
++i;
}
}
else
{
temp.szData += m_szStrIn[i];
}
}
if (')' != m_szStrIn[length-1])
{
d1.push(temp);
}
// 转换后缀表达式
std::stack<_data> s1;
std::queue<_data> q2;
_data tt;
tt.szData = _T("");
tt.dataType = LOW;
s1.push(tt);
for (;d1.size() > 0;)
{
if (DATA == d1.front().dataType)
{
q2.push(d1.front());
}
else if (d1.front().dataType > s1.top().dataType)
{
s1.push(d1.front());
}
else
{
if ("(" == d1.front().szData)
{
s1.push(d1.front());
}
else if (")" == d1.front().szData)
{
while ("(" != s1.top().szData)
{
q2.push(s1.top());
s1.pop();
}
s1.pop();
}
else
{
do
{
q2.push(s1.top());
s1.pop();
} while ((d1.front().dataType) <= (s1.top().dataType));
s1.push(d1.front());
}
}
d1.pop();
}
for(;LOW != s1.top().dataType;)
{
q2.push(s1.top());
s1.pop();
}
// s1.size();q2.size();d1.size();
while (!s1.empty())
{
s1.pop();
}
// 计算
for (;!q2.empty();)
{
if (DATA == q2.front().dataType)
{
q2.front().num = _tstof(q2.front().szData);
s1.push(q2.front());
}
else
{
_data tmpData;
tmpData.dataType = DATA;
tmpData.num = 0.0;
tmpData.szData = _T("");
switch (q2.front().szData[0])
{
case '+':
tmpData = s1.top();
s1.pop();
s1.top().num += tmpData.num;
break;
case '-':
tmpData = s1.top();
s1.pop();
s1.top().num -= tmpData.num;
break;
case '*':
tmpData = s1.top();
s1.pop();
s1.top().num *= tmpData.num;
break;
case '/':
tmpData = s1.top();
if (0.0 == tmpData.num)
{
return FALSE;
}
s1.pop();
s1.top().num /= tmpData.num;
break;
default:;break;
}
}
q2.pop();
}
rValue = s1.top().num;
return TRUE;
}