:
pair>CVecChar2Pos;
typedefstd:
:
vectorCVecBolan;
public:
//检查算术表达式是否正确匹配.
//return:
错误(不匹配)返回,正确返回非.
boolCheckMathExp();
//获取错误描述
consttstring&GetErrDesc()const;
//获取错误位置
intGetErrPos()const;
private:
//类似printf的方式创建一个格式化的字符串。
请注意不要超过个字节,否则将会造成越界崩溃.
//返回一个格式化后的字符串.
tstringCreateFormatStr(constTCHAR*lpszFormat,...)const;
//获取字符串的最后一个字符.
TCHARGetEndChar(consttstring&str)const;
TCHARGetEndChar(constCVecChar2Pos&vecPair)const;
//获取字符串某位置前面相邻字符,nPos基于开始.
TCHARGetPreChar(consttstring&str,intnPos)const;
//获取字符串某位置后面相邻字符,nPos基于开始.
TCHARGetNextChar(consttstring&str,intnPos)const;
//出栈
voidPopStack(tstring&str,intnCount=1)const;
//判断字符是否为操作符
boolIsOperator(TCHARch)const;
//判断字符是否为数字
boolIsDigit(TCHARch)const;
//将算术表达式转化成波兰表达式
boolStringToBolan();
//将数字字符串转化成数值
boolStringToDigit(tstringstr,double&dValue);
private:
//算术表达式
tstringm_strMathExp;
//表达式错误(不匹配)位置
intm_nErrPos;
//错误(不匹配)描述
tstringm_strErrDesc;
//存放转化后的波兰表达式
CVecBolanm_vecBolan;
};
//执行文件MathString.cpp
boolCMathString:
:
CheckMathExp()
{
if(m_strMathExp.empty())//若算术表达式为空,返回false
{
m_strErrDesc=_T("算术表达式为空!
");
returnfalse;
}
//存放括号'('的栈
CVecChar2Posstack;
for(std:
:
string:
:
size_typeix=0;ix!
=m_strMathExp.size();++ix)
{
m_nErrPos=(int)ix;
TCHARch=m_strMathExp[ix];
if(ch==_T('('))//若是左括号'(',则入栈
{
stack.push_back(std:
:
make_pair(ch,ix));
}
elseif(ch==_T(')'))
{
if(GetEndChar(stack)==_T('('))//若栈的顶端字符为'(',则匹配,出栈
{
stack.pop_back();
}
else//若栈的顶端字符为非'(',不匹配,返回false
{
m_strErrDesc=CreateFormatStr(_T("\n错误:
没找到与位置%d处的操作符')'相匹配的操作符'('!
"),m_nErrPos);
returnfalse;
}
}
elseif(ch==_T('+')||ch==_T('-'))//若是'+'或'-',检查后面相邻字符
{
TCHARchTmp=GetNextChar(m_strMathExp,ix);
if(chTmp==_T('\0')||IsOperator(chTmp))
{
m_strErrDesc=CreateFormatStr(_T("\n错误:
位置%d处的操作符'%c'没有右值!
"),m_nErrPos,ch);
returnfalse;
}
}
elseif(ch==_T('*')||ch==_T('/')||ch==_T('%'))//若是'*'或'/'或'%',检查前后相邻字符
{
TCHARchTmp=GetPreChar(m_strMathExp,ix);
if(chTmp==_T('\0')||IsOperator(chTmp))
{
m_strErrDesc=CreateFormatStr(_T("\n错误:
位置%d处的操作符'%c'没有左值!
"),m_nErrPos,ch);
returnfalse;
}
chTmp=GetNextChar(m_strMathExp,ix);
if(chTmp==_T('\0')||IsOperator(chTmp))
{
m_strErrDesc=CreateFormatStr(_T("\n错误:
位置%d处的操作符'%c'没有右值!
"),m_nErrPos,ch);
returnfalse;
}
}
elseif(ch==_T('.'))//若是小数点('.'),检查前后相邻字符是否为阿拉伯数字
{
TCHARchTmp=GetPreChar(m_strMathExp,ix);
if(!
IsDigit(chTmp))
{
m_strErrDesc=CreateFormatStr(_T("\n错误:
位置%d处的小数点前面没有左值!
"),m_nErrPos);
returnfalse;
}
chTmp=GetNextChar(m_strMathExp,ix);
if(!
IsDigit(chTmp))
{
m_strErrDesc=CreateFormatStr(_T("\n错误:
位置%d处的小数点前面没有右值!
"),m_nErrPos);
returnfalse;
}
}
elseif(!
IsDigit(ch))//若为暂不能识别的字符
{
m_strErrDesc=CreateFormatStr(_T("\n错误:
当前暂不能识别%d处的符号'%c'!
"),m_nErrPos,ch);
returnfalse;
}
}
//判断栈里是否还存有'('
CVecChar2Pos:
:
const_reverse_iteratorit=stack.rbegin();
if(it!
=stack.rend())
{
m_strErrDesc=CreateFormatStr(_T("\n错误:
没找到与位置%d处的操作符'('相匹配的操作符')'!
"),it->second);
returnfalse;
}
returntrue;
}