ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

表达式转换(中缀表达式转后缀表达式) 递归算法

2021-10-10 13:01:58  阅读:154  来源: 互联网

标签:操作数 中缀 后缀 int k1 操作符 str 表达式


圆括号可以嵌套,左圆括号后面又是表达式,形成表达式的递归定义。

圆括号具有最高优先级,其次是乘除,最后是加减。

最外层看成操作数1和操作数2及操作符+或-的组合表达式;第二层看成操作数1和操作数2及操作符*或/的组合表达式,最内层为圆括号括起来的表达式。

最内层返回第二层,第二层返回第一层,与计算逻辑相符。

后缀表达式为操作数+操作数+操作符,操作数可以是后缀表达式。

如有问题请指出,谢谢~

bool IsOpOrNum(string str)
{
	char c = str[0];
	if (c == '+' || c == '-' || c == '*' || c == '/' ||(c >= 'a' && c <= 'z')||(c>='A'&&c<='Z')) return true;
	return false;
}
string InfixToPostfix1(string str)
{
	//递归到长度为1
	if (str.length() == 1 && IsOpOrNum(str)) return str;
	//倒着遍历
	//最外层看成操作数和操作数和操作符+或-的组合的表达式
	//下一层看成操作数和操作数和操作符*或/的组合的表达式
	//最内层被括号包括的表达式
	char x;
	SeqStack<char>s1;//存放右括号,遇到左括号退栈
	//m记录当看成操作数和操作数和操作符+或-的组合的表达式时操作符的个数
	//n记录当看成操作数和操作数和操作符*或/的组合的表达式时操作符的个数
	int m = 0, n = 0;
	//k1记录m==1时操作符+或-的位置
	//k2记录n==1时操作符*或/的位置
	int k1, k2;
	//part1为操作符前的表达式
	//part2为操作符后的表达式
	//op为该操作符
	string part1, part2, op;
	for (int i = str.size() - 1; i >= 0; i--)
	{
		if (str[i] == ')') s1.Push(str[i]);
		else if (str[i] == '(') s1.Pop(x);//通过栈中是否含有右括号来判断此时表达式是否处于括号内
		if ((str[i] == '+' || str[i] == '-') && s1.IsEmpty() == true)
		{
			m += 1; //记录当看成操作数和操作数和操作符 + 或 - 的组合的表达式时操作符的个数
			if (m == 1)
			{
				k1 = i;//记录m==1时操作符+或-的位置
			}
		}
		if ((str[i] == '*' || str[i] == '/') && s1.IsEmpty() == true)
		{
			n += 1; //记录当看成操作数和操作数和操作符* 或 / 的组合的表达式时操作符的个数
			if (n == 1)
			{
				k2 = i;//记录n==1时操作符*或/的位置
			}
		}
	}
		if (m != 0)//最外层括号外表达式含有+或-
		{
			op = str[k1];
			for (int k = 0; k < k1; k++)
			{
				part1 += str[k];
			}
			for (int k = k1 + 1; k <= str.size() - 1; k++)
			{
				part2 += str[k];
			}
			return InfixToPostfix1(part1) + InfixToPostfix1(part2) + op;
		}
		if (m == 0 && n != 0)//最外层括号外表达式不含+或-但含*或/
		{
			op = str[k2];
			for (int k = 0; k < k2; k++)
			{
				part1 += str[k];
			}
			for (int k = k2 + 1; k <= str.size() - 1; k++)
			{
				part2 += str[k];
			}
			return InfixToPostfix1(part1) + InfixToPostfix1(part2) + op;
		}
		if (m == 0 && n == 0)//仅为括号包括的表达式
		{
			string temp;
			if (str[str.size()-1] == ')')
			{
				for (int i = 1; i < str.size() - 1; i++)
				{
					temp += str[i];
				}
				return InfixToPostfix1(temp);
			}
		}
}

标签:操作数,中缀,后缀,int,k1,操作符,str,表达式
来源: https://blog.csdn.net/m0_59048867/article/details/120661748

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有