3.栈和队列的应用
大约 1 分钟
中缀表达式转后缀表达式
算法思想
- 从左向右开始扫描中缀表达式
- 遇到数字时,加入后缀表达式
- 遇到运算符时:
- 若为
(入栈 - 若为
),则依次把栈中的运算符加入后缀表达式,直到出现(,从栈中删除( - 若为除括号外的其他运算符,当其优先级高于除
(外的栈项运算符时,直接入栈。否则从栈顶开始,依次弹出比当前处理的运算符优先级高和优先级相等的运算符,直到一个比它优先级低的或遇到了一个左括号为止。
- 若为
- 当扫描的中缀表达式结束时,栈中的所有运算符依次出栈加入后缀表达式
例子
中缀表达式a/b+(c*d-e*f)/g的转换过程如下:
手工做法
- 按照运算符的优先级对所有的运算单位加括号,例如上面式子变成
((a/b)+(((c*d)-(e*f))/g)) - 转换为前缀或后缀表达式
- 前缀:把运算符号移动到对应的括号前面
- 后缀:把运算符号移动到对应的括号后面
- 把括号去掉
