参考博客: https://blog.csdn.net/swust_zeng_zhuo_k/article/details/70187831
https://blog.csdn.net/yyyyxcy/article/details/78513972
谢谢两位博主的博客带给我的启发
转换规则
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。
举个例子:
a + b * c + ( d * e+ f ) * g
为了方便后面的讲解,我把每个运算符都标上了不同的颜色,方便大家理解。
转后之后为后缀表达式为
abc*+de*f+g*+
准备处理的字符 | 栈内存储的运算符 新增的运算符放到右边 | 后缀表达式 |
a(直接输出) | a | |
+ | + | a |
b | + | ab |
c | + | abc |
* | + * | abc |
+ (新的加号加入到栈中 此时 新的+号的运算符等级没有 * 高 所以将 * 和第一个+ 依次输出 再把第二个 + 压入到栈中 ) | + | abc*+ |
( | +( | abc*+d |
d | +( | abc*+d |
* | + ( * | abc*+d |
e | + ( * | abc*+de |
+ (新的加号加入到栈中 此时 新的+号的运算符等级没有 * 高 所以将 * 输出 再把第三 个 + 压入到栈中 ) | + (+ | abc*+de* |
f | + (+ | abc*+de*f |
) ( 这个右括号和上一个括号组成一对 将里面的运算符输出 括号不输出) | + (+)------ + | abc*+de*f+ |
* | + * | abc*+de*f+ |
g | + * | abc*+de*f+g |
无 (按进栈顺序将栈内的运算符输出 ) | abc*+de*f+g*+
|