【LittleXi】波兰式转逆波兰式

【LittleXi】波兰式转逆波兰式

说明:

波兰式(中缀表达式),例如8+(7/2) * (5-4)+(5+2)*4
将这个转化为逆波兰式子(后缀表达式)为8 7 2 / 5 4 - * + 5 2 + 4 * +

转化步骤:

这里我们可以考虑利用栈来维护转化步骤:

  • 遇到数字就直接输出,遇到符号,根据优先级来判断进出栈情况
  • 标记每种符号对应的优先级:
    ^:3
    * / %:2
    + -:1
    ( : 0
    记栈为stack,指向波兰式的指针为p=0;
    在这里插入图片描述
    isp叫做栈内(in stack priority)优先数。
    icp叫做栈外(in coming priority)优先数。
    操作符优先数相等的情况只出现在括号配对或栈底的‘#’号与输入流最后的‘#’号配对时。

操作符栈初始化,将结束符‘#’进栈。然后读入中缀表达式字符流的首字符ch。
重复执行以下步骤,直到ch = ‘#’,同时栈顶的操作符也是‘#’,停止循环。
若ch是操作数直接输出,读入下一个字符ch。
若ch是操作符,判断ch的优先级icp和位于栈顶的操作符op的优先级isp:
若 icp (ch) > isp (op),令ch进栈,读入下一个字符ch。
若 icp (ch) < isp (op),退栈并输出。
若 icp (ch) == isp (op),退栈但不输出,若退出的是‘(’号读入下一个字符ch。
算法结束,输出序列即为所需的后缀表达式。

int main()
{
	string ms;
	cin >> ms;
	string hs;
	unordered_map<char, int> isp;
	unordered_map<char, int> icp;
	isp['^'] = 6;
	isp['%'] = 5;
	isp['/'] = 5;
	isp['*'] = 5;
	isp['+'] = 3;
	isp['-'] = 3;
	isp['('] = 1;
	isp[')'] = 8;

	icp['^'] = 7;
	icp['%'] = 4;
	icp['/'] = 4;
	icp['*'] = 4;
	icp['+'] = 2;
	icp['-'] = 2;
	icp['('] = 8;
	icp[')'] = 1;
	vector<int> sta;
	for (int i = 0; i < ms.size(); i++)
	{
		if (ms[i] >= '0' && ms[i] <= '9')
		{
			hs += ms[i];
			continue;
		}
		cout << ms[i] << endl;
		while (isp[sta.back()] > icp[ms[i]])
		{
			hs += sta.back();
			sta.pop_back();
		}
		if (isp[sta.back()] < icp[ms[i]])
			sta.push_back(ms[i]);
		if (isp[sta.back()] == icp[ms[i]])
			sta.pop_back();
	}
	while (sta.size())
	{
		hs += sta.back();
		sta.pop_back();
	}
	cout << hs << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值