1 准备一个栈来保存 运算符
2 从右至左开始获取字符
2.1 如果当前的字符为数字,则直接输出
2.2 如果当前的字符为运算符,但不是“)” ,从运算符栈中取得栈顶的运算符,判断当前的运算符的优先级是否大于等于栈顶运算符的优先级
A. 如果优先级大于等于栈顶运算符的优先级,则将此运算符入栈
B. 否则,对站内的运算符进行出栈,并输出,直到当前的运算符优先级大于等于栈顶运算符的优先级
2.3 如果当前字符为“)”,直接入栈
2.4 如果当前字符为“(”,出栈并输出,直到栈顶元素为“)”时,将“)”出栈。
3 一直循环2的操作
4 直到扫描结束,将栈内所有的运算符出栈并输出。
void MainFunction(string &str)
{
char cGetch = '\0';
char cOp = '\0';
int iGetFigure = 0;
int iRet = 1;
bool bRet = FALSE;
string nStr = str;
while ( iRet !=0 )
{
// 从右边开始取字符
iRet = GetCharOrFigure( nStr,&cGetch, &iGetFigure);
switch (iRet)
{
case 0: //字符串已经扫描结束
while(false == OperatorStack.empty())
{
cOp = OperatorStack.top();
OperatorStack.pop();
OutputNewExpression( &cOp, 0);
}
break;
case 1: // 当前字符是 运算符
if(OperatorStack.empty())
{
// 如果是空栈,则将运算符直接入栈
OperatorStack.push( cGetch );
}
else
{
// 取得栈顶元素判断 优先级,如果新的优先级大于栈顶的优先级,
cOp = OperatorStack.top();
//OperatorStack.pop();
bRet = JudgePriority(&cGetch, &cOp);
if ( TRUE == bRet )
{
// 新运算符的优先级高,直接入栈
OperatorStack.push( cGetch );
}
else
{
// 输出这个运算符
OperatorStack.pop();
OutputNewExpression( &cOp, 0);
do
{
if ( OperatorStack.empty() )
{
// 如果是空栈,则将运算符直接入栈
break;
}
else {
// get new opertor from statck
cOp = OperatorStack.top();
OperatorStack.pop();
OutputNewExpression( &cOp, 0);
// judge priority
bRet = JudgePriority(&cGetch, &cOp);
if (TRUE == bRet)
{
break;
}
}
} while ( FALSE == bRet );
OperatorStack.push(cGetch);
}
}
break;
case 2: // 当前字符是 操作数
// 如果是数字,直接输出数字
OutputNewExpression(NULL,iGetFigure);
break;
case 3: //if current charactor is "(" or ")"
if ( cGetch == ')' )
{
OperatorStack.push( cGetch );
}
else
{
cOp = OperatorStack.top();
OperatorStack.pop();
while ( cOp != ')' )
{
OutputNewExpression( &cOp, 0);
cOp = OperatorStack.top();
OperatorStack.pop();
}
}
break;
default:
break;
}
}
}