该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#include
#include
#include
typedef int BOOL;
BOOL GetValue(const std::string& m_szStrIn, double& outValue);
int _tmain(int argc, _TCHAR* argv[]){
std::string sss = "1+-3*4/(-4+-2)*4/6+-8";
double nValue = 0; GetValue( sss, nValue);
printf("%f", nValue); getchar();return 0;
}
struct _data {
int dataType;
std::string szData;
double num;
};
BOOL GetValue(const std::string& m_szStrIn, double& outValue)
{
enum {LOW = 0, OPE = 1, OPEL = 2, OPEH = 3, DATA = 4};
std::queue d1;
struct _data temp;
temp.szData = "";
temp.dataType = DATA;
int length = m_szStrIn.size();
temp.szData += 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.length())
{
d1.push(temp);
temp.szData.clear();
}
struct _data tt;
tt.szData = 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 = "";
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 = atof(q2.front().szData.c_str());
s1.push(q2.front());
}
else
{
_data tmpData;
tmpData.dataType = DATA;
tmpData.num = 0.0;
tmpData.szData = "";
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)
{
outValue = 0.0;
return 0;
}
s1.pop();
s1.top().num /= tmpData.num;
break;
default:;break;
}
}
q2.pop();
}
outValue = s1.top().num;
return 1;
}