从头到尾读取中缀表达式的每个对象,对不同对象按不同的情况处理。
- 运算数:直接输出;
- 左括号:压入栈;
- 右括号:将栈顶的运算符弹出并输出,直到遇到左括号(出栈,不输出);
- 运算符:
- 若优先级大于栈顶运算符时,则把它压栈;
- 若优先级小于等于栈顶运算符时,将栈顶运算符弹出并输出;再比较新的栈顶运算符,直到该运算符大于栈顶运算符优先级为止,然后将该运算符压栈。
- 若各对象处理完毕,则把堆栈中存留的运算符一并输出。
中缀转换为后缀示例:(2*(9+6/3-5)+4)
步骤 | 待处理表达式 |
堆栈状态 (底<-->顶) |
输出状态 |
1 | 2*(9+6/3-5)+4 | ||
2 | *(9+6/3-5)+4 | 2 | |
3 | (9+6/3-5)+4 |
*
|
2 |
4 | 9+6/3-5)+4 | *( | 2 |
5 | +6/3-5)+4 | *( | 29 |
6 | 6/3-5)+4 | *(+ | 29 |
7 | /3-5)+4 | *(+ | 296 |
8 | 3-5)+4 | *(+/ | 296 |
9 | -5)+4 | *(+/ | 2963 |
10 | 5)+4 | *(- | 2963/+ |
11 | )+4 | *(- | 2963/+5 |
12 | +4 | * | 2963/+5- |
13 | 4 | + | 2963/+5-* |
14 | + | 2963/+5-*4 | |
15 | 2963/+5-*4+ |