中缀表达式转换为前缀表达式的方法

来源:互联网 发布:淘宝网站证书错误 编辑:程序博客网 时间:2024/06/05 02:41

1 准备一个栈来保存 运算符

2 从右至左开始获取字符

2.1 如果当前的字符为数字,则直接输出

2.2 如果当前的字符为运算符,但不是“)” ,从运算符栈中取得栈顶的运算符,判断当前的运算符的优先级是否大于等于栈顶运算符的优先级

      A. 如果优先级大于等于栈顶运算符的优先级,则将此运算符入栈

     B. 否则,对站内的运算符进行出栈,并输出,直到当前的运算符优先级大于等于栈顶运算符的优先级

        2.3 如果当前字符为“)”,直接入栈

        2.4 如果当前字符为“(”,出栈并输出,直到栈顶元素为“)”时,将“)”出栈。

一直循环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 statckcOp = OperatorStack.top();OperatorStack.pop();OutputNewExpression( &cOp, 0); // judge prioritybRet = 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;}}}

原创粉丝点击