我们学习的算法中的表达式有中缀、前缀和后缀之分,到底有什么区别呢?
中缀(INFIX)
中缀表达式(infix expression)可以是单个变量,或两个变量以及中间的操作符。
AA + B(A + B) + (C – D)
前缀(PREFIX)
前缀表达式(prefix expression)可以是单个变量,一个操作符,后面跟两个操作数,每个前缀表达式包括一个操作符和两个操作数。
A+ A B+ + A B – C D
后缀(POSTFIX)
后缀表达式(postfix expression),也叫反转的波兰记法(Reverse Polish Notation)可以是单个变量,或者是两个操作数外跟一个操作符,每个后缀表达式包括两个操作数后跟一个操作符。
AA 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 callarray elementstruct or union member 17 left-to-right — ++ increment, decrement 16 left-to-right !~– +& *sizeof logical NOTone’s complementunary minus or plusaddress or indirectionsize (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