后缀表达式求值及校验
2007-03-15 21:54:48 来源:WEB开发网核心提示: void CB05031126Dlg::OnCalculate(){// TODO: Add your control notification handler code hereUpdateData(TRUE);m_expression.TrimLeft();m_expression.T
void CB05031126Dlg::OnCalculate()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_expression.TrimLeft();
m_expression.TrimRight();
m_expression=trimblank(m_expression);
CStack s;
int i=0;
int j,k;
int ntemp;//临时操作数
int ntemp1;//临时操作数
int ntemp2;//临时操作数
int result;//运算结果
//int opNum=getop(m_expression);
if(check(m_expression)==1)//检验非法字符
{
while((i<m_expression.GetLength())&&(s.getflag()!=0))
{
if((m_expression[i]==''+'')||
(m_expression[i]==''-'')||
(m_expression[i]==''*'')||
(m_expression[i]==''/''))
{
if(m_expression[i]==''+'')//完成加法运算
{
ntemp1=s.Top();
s.Pop();
ntemp2=s.Top();
s.Pop();
ntemp=ntemp1+ntemp2;
s.Push(ntemp);
}
if(m_expression[i]==''-'')//完成减法运算
{
ntemp1=s.Top();
s.Pop();
ntemp2=s.Top();
s.Pop();
ntemp=ntemp2-ntemp1;
s.Push(ntemp);
}
if(m_expression[i]==''*'')//完成乘法运算
{
ntemp1=s.Top();
s.Pop();
ntemp2=s.Top();
s.Pop();
ntemp=ntemp1*ntemp2;
s.Push(ntemp);
}
if(m_expression[i]==''/'')//完成除法运算
{
ntemp1=s.Top();
s.Pop();
ntemp2=s.Top();
s.Pop();
if(ntemp1!=0)
{
ntemp=ntemp2/ntemp1;
s.Push(ntemp);
}
else
{
s.setflag(0);
}
}
k=k+2;
}
else
{
ntemp=m_expression[i]-48;
k=i+1;
while((k<m_expression.GetLength())&&
(m_expression[k]!='' '')&&
(m_expression[k]!=''+'')&&
(m_expression[k]!=''-'')&&
(m_expression[k]!=''*'')&&
(m_expression[k]!=''/''))
{
k++;
}
for(j=i+1;j<k;j++)
//讲表达式中的数字字符转换为整型
ntemp=ntemp*10+(m_expression[j]-''0'');
s.Push(ntemp);
}
i=k+1;
}
if((s.getflag()!=0)&&(s.getcount()-getop(m_expression)==1)&&(s.getsum()==1))
{
result=s.Top();
m_result.Format("%d",result);
UpdateData(FALSE);
}
else
{
MessageBox("表达式错误!请重新输入!");
}
}
else
{
MessageBox("表达式错误!请重新输入!");
}
}
附言:本程序为南京邮电大学软件工程专业程序设计实验,我在做的时候附加实现了对表达式的校验,理论上应该可以检测出任何错误的表达式。
更多精彩
赞助商链接