1、后缀表达式简介
后缀表达式即逆波兰式,是波兰逻辑学家卢卡西维奇(Lukasiewicz)于1929年发明的一种表示表达式的方法。区别于我们常用的中缀表达式(如2+3*5),后缀表达式是将每个运算符放到操作数之后,没有优先级和括号,例如2 3 5 * + 。
2、中缀表达式转后缀达式的方法
定义一个栈S,存储运算符和操作数。
1、如果检测到操作数,直接加入后缀表达式。
2、如果检测到运算符:
a、如果栈S为空或者运算符为"("或者栈顶运算符为"(",直接加入栈中;
b、如果是"(",则依次将栈中运算符弹出加入到后缀表达式中,直到遇到"("停止,并删除"("。
c、如果是"+"、"-"、"*"、"/"运算符:
- 如果栈S为空或者顶运算符为"(",直接加入栈中;
- 如果当前运算符优先级高于栈顶运算符,则直接入栈;
- 否则,依次弹出栈顶运算符加入后缀表达式,直到栈顶运算符低于当前运算符或者栈为空或者遇到一个"(",然后将它入栈。
3、遍历完整个中缀表达式后,如果栈非空,则依次弹出加入后缀表达式。
注:后缀表达式不包含括号。
3、举例
有中缀表达式 A+B*(C-D)/E+F/H。
- 遇到操作数A加入后缀表达式。此时后缀表达式内容(A)。栈为空。
- 遇到"+",栈顶为空,直接入栈。此时后缀表达式为(A)。
- 遇到B,直接加入后缀表达式。此时后缀表达式为(A B)。
- 遇到"*",优先级高于栈顶元素"-",直接入栈。此时后缀表达式为(A B)。
- 遇到"(",直接入栈。此时后缀表达式为(A B)。
- 遇到C,加入后缀表达式。此时后缀表达式为(A B C)。
- 遇到"-",因为栈顶为"(",所以直接入栈。此时后缀表达式为(A B C)。
- 遇到D,加入后缀表达式。此时后缀表达式为(A B C D)。
- 遇到")",依次弹出栈顶元素,直到遇到"(",并删除"("。此时后缀表达式为(A B C D -)。
- 遇到”/",优先级并不大于栈顶运算符"*",故弹出"*",遇到"-",优先级小于它,则终止,将"/"入栈。此时后缀表达式为(A B C D - * )。
- 此后类似,不再列举,直到遍历完整个中缀表达式。此时后缀表达式为(A B C D - * E / + F H ),而非空。
- 依次弹出栈中元素加入后缀表达式,得到最终的后缀表达为(A B C D - * E / + F H / +)。
完结撒花~~~如果对您有帮助,还请多多支持哦,谢谢!