圆括号可以嵌套,左圆括号后面又是表达式,形成表达式的递归定义。
圆括号具有最高优先级,其次是乘除,最后是加减。
最外层看成操作数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);
}
}
}