实现根据中缀表达式求后缀表达式【基本思路与需要注意的几个点】

判断是否是数字,是数字直接加入后缀

if (suf >="0" && suf<="9")

碰到运算符

先判断是不是右括号,如果是右括号,则一直出栈一直到栈空或者碰到"("。

如果不是右括号且栈空

则直接入栈

如果不是右括号但栈不空,则需要和栈顶的元素进行优先级比较

如果栈顶元素优先级大于等于该元素,则栈顶元素出栈,一直出栈到栈顶元素的优先级小于该元素或者栈为空,此时将该元素入栈。

优先级比较函数priority 的实现思路

return false; 表示栈顶不需要出栈。 return true; 该栈顶需要出栈

如果栈顶元素是"("则该元素直接入栈 return false;

如果该元素是"("也直接入栈 return false;

如果栈顶元素是* 或 / ,那么该栈顶元素的优先级一定大于等于该元素,则栈顶元素出栈。return true;

如果栈顶元素是+ - ,那么该元素需要是* / 才return true; 否则也是return false;

c++完整实现代码如下

bool priority(string stack_opera,string opera)
{
	if (stack_opera == "(" ||opera == "(") //stack_opera和opera是( 则一定不需要出栈
		return false;
	if (stack_opera == "*" || stack_opera == "/")
	{
		return true; //stack_opera 为 * / 的时候优先级一定是大于等于opera的
	}
	else // 栈顶那么为+ 或 -
	{ 
		//除非opera此时是* / 否则优先级一定小于等于stack_opera
		if (opera == "*" || opera == "/")
			return false;
		else
			return true;
	}
}


//中缀表达式转后缀表达式
vector<string> InfixToSuffix(vector<string> inffix)
{
	vector<string> suffix;
	stack<string> s;
	string temp;
	for(string suf: inffix)
	{
		if (suf >="0" && suf<="9")
		{
			suffix.push_back(suf); // 数字直接加入suffix
		}
		else
		{
			// 栈不为需要判断优先级来决定是否需要将栈顶元素出栈
			if (suf == ")") 
			{
				// 碰到")" 一直出栈,直到"("。
				while (!s.empty() && s.top() != "(")
				{
					suffix.push_back(s.top());
					s.pop();
				}
				s.pop(); //此时左括号也需要出栈
				continue; //如果是碰到右括号一直出栈到左括号就ok下面不用执行。
			}
			//不是右括号,运算符需要入栈,则需要判断优先级 
			while (!s.empty() && priority(s.top(), suf) ) 
			{
				//true说明栈顶的优先级大于等于suf,需要出栈
				suffix.push_back(s.top());
				s.pop(); // 继续判断下一个栈顶元素
			}
			//while循环后,说明此时的suf的优先级的大于栈顶元素的,此时入栈
			s.push(suf);
		}
	}
	while (!s.empty())
	{
		suffix.push_back(s.top());
		s.pop();
	}
	return suffix;
}

测试使用的main函数可以这么写:

2+(4+6)/2 + 6/3   (中缀)

\ 2 4 6 + 2 / + 6 3 / +  (后缀)

int main()
{
	//vector<string> v = { "(","1","+","2",")","*","(","3","+","4",")"};
	vector<string> v = { "2","+","(","4","+","6",")","/","2",
					"+","6","/","3" };
	vector<string> v1 = InfixToSuffix(v);
	for (string val : v1)
	{
		cout << val<< " ";
	}
}

运行结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值