二元运算符的表达式定义为:(操作数) + (运算符) + (操作数) ,其中操作数也可以为表达式。
在计算机中,根据运算符所在的不同位置来命名,表达式可以有如下三种不同的表示方法:
记表达式为:Exp = S1 + OP + S2, S1和S2为操作数,OP为运算符。
则称 OP + S1 + S2 为表达式的前缀表示法;
称 S1 + OP + S2 为表达式的中缀表示法;
称 S1 + S2 + OP 为表达式的后缀表示法。
例如,对于表达式 Exp = a * b + (c - d / e) * f
前缀表达式为: + * a b * - c / d e f
中缀表达式为: a * b + c - d / e * f
后缀表达式为: a b * c d e / - f * +
对于这三种表达式,操作数之间的相对次序不变,而运算符的相对次序却不同。前缀表达式的运算规则为:连续出现的两个操作数和在它们 之前且紧靠它们的运算符构成一个最小表达式。中缀表达式由于丢失了括号信息,从而导致运算的次序不确定。后缀表达式是波兰逻辑学家 Jan.Lukasiewicz 发明的,通常又称为逆波兰表达式,它不需要括号,运算规则为:运算符在式中出现的顺序恰为表达式的运算顺序;每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式。
利用逆波兰表达式进行求值,对我们人类来说是不大好接受的,但是对计算机来说却是非常方便的,因为利用栈就能够很容易实现。具体的求值方法是先找运算符后找操作数。下面通过图示来进行分析。
例如对于表达式:1.3 * 2 + (5.1 - 3.6 / 2) * 4,其逆波兰表达式为:1.3 2 * 5.1 3.6 2 / - 4 * +
利用栈来对逆波兰表达式求值过程如下:
① 建立一个栈,首先将操作数 1.3 和 2 入栈,遇到 * 运算符则依次弹出两个元素进行运算&