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

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 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;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值