全球旧事资料 分类
式。例如,要对下面的算术表达式求值:
42×3105首先要了解算术四则运算的规则。即:
(1)先乘除,后加减;(2)从左算到右;(3)先括号内,后括号外。由此,这个算术表达式的计算顺序应为42×310546105101051028算符优先法就是根据这个运算优先关系的规定来实现对表达式的编译或解释执行的。任何一个表达式都是由操作数opera
d、运算符operator和界限符delimiter组成的,我们称它们为单词。一般地,操作数既可以是常数也可以是被说明为变量或常量的标识符;运算符可以分为算术运算符、关系运算符和逻辑运算符3类;基本界限符有左右括号和表达式结束符等。为了叙述的简洁,我们仅讨论简单算术表达式的求值问题。这种表达式只含加、减、乘、除4种运算符。读者不难将它推广到更一般的表达式上。我们把运算符和界限符统称为算符,它们构成的集合命名为OP。根据上述3条运算规则,在运算的每一步中,任意两个相继出现的算符θ1和θ2之间的优先关系至多是下面3种关系之一
θ1θ2θ1的优先权低于θ2θ1θ2θ1的优先权等于θ2θ1θ2θ1的优先权高于θ2表1定义了算符之间的这种优先关系。表1算符间的优先关系
由规则(3),、、和为θ1时的优先性均低“(”但高于“)”,由规则(2),当θ1θ2时,令θ1θ2,“”是表达式的结束符。为了算法简洁,在表达式的最左边也虚设一个“”构成整个表达式的一对括号。表中的“(”“)”表示当左右括号相遇时,括号内的运算已经完成。同理,“”“”表示整个表达式求值完毕。“)”与“(”、“”与“)”以及“(”与“”之间无优先关系,这是因为表达式中不允许它们相继出现,一旦遇到这种情况,则可以认为出现了语法错误。在下面的讨论中,我们暂假定所输入的表达式不会出现语法错误。
为实现算符优先算法,可以使用两个工作栈。一个称做OPTR,用以寄存运算符;另一个称做OPND,用以寄存操作数或运算结果。算法的基本思想的:
(1)首先置操作数栈为空栈,表达式起始符“”为运算符栈的栈底元素;(2)依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为“”)。以下算法描述了这个求值过程。
fOpera
dTypeEvaluateExpressio
算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。I
itStackOPTRPushr
好听全球资料 返回顶部