上一篇讲述了如何将中序表达式转成后序表达式,这一篇讲述如何计算后序表达式

         思路非常简单,将表达式逐个字符检查,如果不是运算符,则将字符所对应的值放入到栈中,如果是预算符,则看是几元预算符,我所写的例子中都是加减乘除,是二元预算符,那么就可以从栈中取出两个值进行预算,再将预算的结果放入到栈中

         以下是代码:

         

bool Express::CalculateExpress(string strExpress,map<char,int> valueMap,int& iValue){
/************************************************************************/
/*
计算表达式,结果放在iValue中
strExpress:要计算的后序表达式
valueMap:key值是计算表达式中字母,value是字母所对应的值
iValue:计算后的结果
*/
/************************************************************************/
char ch='0';
int i=0;
int iPop=0;
int iNext=0;
int iPopEx=0;
stack<int> valueStack;
bool check=vertifyCalculate(strExpress,valueMap);
if(!check)
{
return false;
}
for(i=0;i<strExpress.length();i++)
{
ch=strExpress.at(i);
if(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/')
{
valueStack.push(valueMap[ch]);
}
else
{
if(valueStack.size()<2)
{
return false;
}
iPop=valueStack.top();
valueStack.pop();
iNext=valueStack.top();
valueStack.pop();
switch(ch)
{
case '+':
{
iPopEx=iPop+iNext;
valueStack.push(iPopEx);
break;
}
case '-':
{
iPopEx=iNext-iPop;
valueStack.push(iPopEx);
break;
}
case '*':
{
iPopEx=iPop*iNext;
valueStack.push(iPopEx);
break;
}
case '/':
{
if(iNext==0)
{
return false;
}
iPopEx=iNext/iPop;
valueStack.push(iPopEx);
break;
}
default:
return false;
}
}
}
if(valueStack.size()!=1)
{
return false;
}
iValue=valueStack.top();
return true;
}
bool Express::vertifyCalculate(string strExpress,map<char,int> valueMap){
/************************************************************************/
/*
计算表达式之前,先检查表达式是否正确
*/
/************************************************************************/
if(strExpress=="")
{
return false;
}
map<char,int>::iterator it=NULL;
for(int i=0;i<strExpress.length();i++)
{
char ch=strExpress.at(i);
it=valueMap.find(ch);
if(it==valueMap.end()&&(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'))
{
return false;
}
}
return true;
}