[php] 了解中序表达式的表示法与计算方法 |
中序表达式的表示法与计算方法 这些东西在算法的书中都有讲到,以下是根据回忆做出的记录。 通常编程中的表达式计算均是从左往右读取,考虑运算符优先级,这些都是中序表达式。 处理这种表达式时一般需要 2个栈来存放运算符和操作数,如果运算符的优先权高于下 下面请看一个简单例子:(呆会针对常见迷惑的PHP表达式计算作出理解) $i + $x / $y - $j 0) 建立2个栈,操作数栈和运算符的栈,都是空的。 从左往右读取表达式,如果读到操作数就放入操作数栈中,运算符则放入运算符的栈中 1) 读到 $i +-------+ 2) 读到 + +-------+ +-------+ 3) 读到 $x +-------+
+-------+ +-------+ 4) 读到 $y +-------+ 5) 接着读到 -,由于 - 的运算符比 / 低,故取出 / 并从操作数栈中取出相应的操作数进行 +-------+ 6) 由于操作符栈中还有未运算的符号,故每取出一个运算符同时从操作数栈中取出相应的数进 6.1) 取出 -,双目运算 $x/$y - $j 再回到 PHP中来,我们看两个例子,之前在 geel 及我发的 Quiz 中的例子, :p 1) $i = 2; echo ($i++ + $i); 1.1) 根据上面的基础知识得到以下栈图 +------+ +------+ 1.2) 接着读取到 + 号,发现 + 号的优先级比 ++ 低,故先运算 ++ 再将 + 压入栈(单目运算) +----------------------------+ +------+ 1.3) 读取到 $i 压入操作数栈 ($i = 3) +----------+ 1.2) 取出 + 作最后运算,至此,操作符栈已经全部完成,故运算完毕,操作数中的值就是结果 +----------+ 2) $a = 1; $b =&$a; $b = $a++; 2.1) 仅从 ($b = $a++)出发,先得出如下栈图 +------+ +------+ 2.2) 接着读取到操作数 $a +------+ 2.3) 读到到操作符 ++ ,由于 ++ 的优先级比 = 高,故先取出 $a 做 ++ 运算 +----------------------+ 2.4) 读取 = 号作最后运算 +-----------+ +------+ 2.5) 由于 $b 和 $a 互为关联,$a, $b的值均为最后一次赋值($b=1)的值,所以 $a = $b = 1 |
了解中序表达式的表示法与计算方法 (转)
最新推荐文章于 2022-09-05 17:10:10 发布