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

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

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

最外层看成操作数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);
			}
		}
}

上一篇:redis list/hash/set


下一篇:java8 一些常用操作