1.中缀表达式转后缀表达式
1)四则运算表达式中的括号必须匹配(判断表达式输入的有效性)
2)根据运算符优先级进行转换
3)转换后的表达式中没有括号
4)转换后可以顺序计算出最终结果
2.转换过程:
- 当前元素e为数字:输出
- 当前元素e为运算符:
1).与栈顶运算符进行优先级比较
-.小于等于:将栈顶元素输出,转1
-.大于:将当前元素e入栈
- 当前元素e为左括号:入栈
-当前元素e为右括号:
1.弹出栈顶元素并输出,直至栈顶元素为左括号
2.将栈顶的左括号从栈中弹出
伪代码:
while (!exp.isEmpty())
{
QString e = exp.dequeue();
if (isNumber(e))
{
输出 e;
}
else if (isOperator(e))
{
while( priority(e) <= priority(stack.top()))
输出栈顶元素, stack.pop();
stack.push(e);
}
else if (isLeft(e))
{
stack.push(e);
}
else if (isRight(e))
{
while( !isLeft(stack.top()))
{
输出栈顶元素, stack.pop();
}
从栈中弹出左括号, stack.pop();
}
}
关键点: 转换过程中左右括号是重要标志
-如何确保表达式中的括号能够左右匹配?
-合法的四则运算表达式中
- 括号匹配成对出现
- 左括号必然先于右括号出现
伪代码:
for (int i = 0 ; i < len; i++)
{
if ( exp[i] 为左括号)
{
exp[i] 入栈;
}
else if (exp[i] 为右括号)
{
if (栈顶元素为左括号)
{
将栈顶元素弹出;
}
else
{
匹配错误;
}
}
}