我们学习的算法中的表达式有中缀、前缀和后缀之分,到底有什么区别呢?
中缀(INFIX)
中缀表达式(infix expression)可以是单个变量,或两个变量以及中间的操作符。
A
A + B
(A + B) + (C – D)
前缀(PREFIX)
前缀表达式(prefix expression)可以是单个变量,一个操作符,后面跟两个操作数,每个前缀表达式包括一个操作符和两个操作数。
A
+ A B
+ + A B – C D
后缀(POSTFIX)
后缀表达式(postfix expression),也叫反转的波兰记法(Reverse Polish Notation)可以是单个变量,或者是两个操作数外跟一个操作符,每个后缀表达式包括两个操作数后跟一个操作符。
A
A B +
A B + C D –
前缀和后缀记法是波兰数学家发明的手写数学表达方法,好处就是不需要括号。他们的时间复杂度都是O(n),n为数组元素个数。
INFIX | PREFIX | POSTFIX |
A + B | + A B | A B + |
A + B – C | – + A B C | A B + C – |
(A + B) * C – D | – * + A B C D | A B + C * D – |
为了方便起见,其他一些操作符的优先级和结合性列表如下:
TOKEN | OPERATOR | PRECEDENCE | ASSOCIATIVITY |
( ) [ ] – . | function call array element struct or union member | 17 | left-to-right |
— ++ | increment, decrement | 16 | left-to-right |
! ~ – + & * sizeof | logical NOT one’s complement unary minus or plus address or indirection size (in bytes) | 15 | right-to-left |
(type) | type cast | 14 | right-to-left |
* / % | multiplicative | 13 | left-to-right |
+ – | binary add or subtract | 12 | left-to-right |
<< >> | shift | 11 | left-to-right |
> >= < <= | relational | 10 | left-to-right |
== != | equality | 9 | left-to-right |
& | bitwise AND | 8 | left-to-right |
^ | bitwise XOR | 7 | left-to-right |
| | bitwise OR | 6 | left-to-right |
&& | logical AND | 5 | left-to-right |
|| | logical OR | 4 | left-to-right |
? : | conditional | 3 | right-to-left |
= += /= *= %= &= ^= | assignment | 2 | right-to-left |
, | comma | 1 | left-to-right |