正在加载图片...
第4章栈与队列 OPND(operand的缩写),下面给出对中缀表达式求值的一般规则 (1)建立并初始化OPIR栈和OPND栈,然后在OPTR栈中压入一个“;” (2)从头扫描中缀表达式,取一字符送入ch (3)当ch不等于“;”时,执行以下工作,否则结束算法。此时在OPND栈的栈顶得到运算结果 ①如果ch是运算对象,进OPND栈,从中缀表达式取下一字符送入ch: ②如果ch是运算符,比较ch的优先级icp(ch)和OPTR栈顶运算符isp(OPIR)的优先级 若icp(ch)>ip(OPIR),则ch进OPIR栈,从中缀表达式取下一字符送入ch 若icp(ch)<isp(OPIR,则从OPND栈退出一个运算符作为第2操作数a2,再退出一个运算符 作为第1操作数a1,从OPR栈退出一个运算符θ形成运算指令(a)0(a2),执行结果进OPND栈 若icp(ch)==isp(OPTR)且ch==“)”,则从OPIR栈退出栈顶的“(”,对消括号,然后从中缀表 达式取下一字符送入ch: 根据以上规则,给出计算a+b*(c-d)-e↑f/g时两个栈的变化。 步序扫描项项类型 OPND栈变化OPTR栈变化 OPIR栈与OPND栈初始化,“;进OPTR栈 取第一个符号 操作数 a进OPND栈,取下一符号 操作符 进OPIR栈,取下一符号 b操作数|∝b进OPND栈,取下一符 操作符一icp(*”)>isp(+'),进OPIR栈,取下一符号ab 操作符一 )>isp(“*”),进OPIR栈,取下一符号 进OPND栈,取下一符号 操作符|→ >sp(“(,进OPTR栈,取下一符号 进OPND栈,取下一符 )操作符-p()”)<ip(-”),退OPND栈d,退 OPND abs1 栈‘c,退OPIR栈‘-,计算c-d→st,结果进 OPND栈 10同上同上 ip()”)=psp((),退OPTR栈Y,对消括号,abs1 取下一符号 操作符ip(-)<ip(*”)退OPND栈‘s,退 OPND as2 栈“b',退OPTR栈‘*’,计算b*s1→s2,结果进 up(-”)<sp(+”),退OND栈s;,退OPND|s 栈‘a,退OPTR栈“+,计算a*s2→s3,结果 进OPND栈 同上同上|ip(-”)>sp(;”)进OPIR栈,取下一符号 e进OPND栈,取下 操作符一 ↑’)>is ),进OPTR栈,取下一符号 操作数一f进OPND栈,取下一符号 set 操作符|icp(/)<isp(↑”),退OPND栈f,退 OPNDs3s 栈‘e,退OPIR栈‘↑’,计算e↑f→s4,结果 进OPIR栈,取下一符号 OPND栈,取下一符号 20 操作符ip(;")<isp(/),退OPND栈'g,退OPND 栈‘s,退OPTR栈‘/,计算s4/g→s,结果 进OPND栈第 4 章 栈与队列 40 OPND(operand 的缩写),下面给出对中缀表达式求值的一般规则: (1) 建立并初始化 OPTR 栈和 OPND 栈,然后在 OPTR 栈中压入一个“;” (2) 从头扫描中缀表达式,取一字符送入 ch。 (3) 当 ch 不等于“;”时,执行以下工作,否则结束算法。此时在 OPND 栈的栈顶得到运算结果。 ① 如果 ch 是运算对象,进 OPND 栈,从中缀表达式取下一字符送入 ch; ② 如果 ch 是运算符,比较 ch 的优先级 icp(ch)和 OPTR 栈顶运算符 isp(OPTR)的优先级:  若 icp(ch) > isp(OPTR),则 ch 进 OPTR 栈,从中缀表达式取下一字符送入 ch;  若 icp(ch) < isp(OPTR),则从 OPND 栈退出一个运算符作为第 2 操作数 a2,再退出一个运算符 作为第 1 操作数 a1,从 OPTR 栈退出一个运算符θ形成运算指令 (a1)θ(a2),执行结果进 OPND 栈;  若 icp(ch) == isp(OPTR) 且 ch == “)”,则从 OPTR 栈退出栈顶的“(”,对消括号,然后从中缀表 达式取下一字符送入 ch; 根据以上规则,给出计算 a + b * (c - d) - e↑f / g 时两个栈的变化。 步序 扫描项 项类型 动作 OPND 栈变化 OPTR 栈变化 0  OPTR 栈与 OPND 栈初始化, ‘;’ 进 OPTR 栈, 取第一个符号 ; 1 a 操作数  a 进 OPND 栈, 取下一符号 a ; 2 + 操作符  icp (‘ + ’ ) > isp (‘ ; ’ ), 进 OPTR 栈, 取下一符号 a ; + 3 b 操作数  b 进 OPND 栈, 取下一符号 a b ; + 4 * 操作符  icp (‘ * ’ ) > isp (‘ + ’ ), 进 OPTR 栈, 取下一符号 a b ; + * 5 ( 操作符  icp (‘ ( ’ ) > isp (‘ * ’ ), 进 OPTR 栈, 取下一符号 a b ; + * ( 6 c 操作数  c 进 OPND 栈, 取下一符号 a b c ; + * ( 7 - 操作符  icp (‘ - ’ ) > isp (‘ ( ’ ), 进 OPTR 栈, 取下一符号 a b ; + * ( - 8 d 操作数  d 进 OPND 栈, 取下一符号 a b c d ; + * ( - 9 ) 操作符  icp (‘ ) ’ ) < isp (‘ - ’ ), 退 OPND 栈 ‘d’, 退 OPND 栈 ‘c’, 退 OPTR 栈 ‘-’, 计算 c – d → s1, 结果进 OPND 栈 a b s1 ; + * ( 10 同上 同上  icp (‘ ) ’ ) == isp (‘ ( ’ ), 退 OPTR 栈‘(’, 对消括号, 取下一符号 a b s1 ; + * 11 - 操作符  icp (‘ - ’ ) < isp (‘ * ’ ), 退 OPND 栈 ‘s1’, 退 OPND 栈 ‘b’, 退 OPTR 栈 ‘*’, 计算 b * s1 → s2, 结果进 OPND 栈 a s2 ; + 12 同上 同上  icp (‘ - ’ ) < isp (‘ + ’ ), 退 OPND 栈 ‘s2’, 退 OPND 栈 ‘a’, 退 OPTR 栈 ‘+’, 计算 a * s2 → s3, 结果 进 OPND 栈 s3 ; 13 同上 同上  icp (‘ - ’ ) > isp (‘ ; ’ ), 进 OPTR 栈, 取下一符号 s3 ; - 14 e 操作数  e 进 OPND 栈, 取下一符号 s3 e ; - 15 ↑ 操作符  icp (‘↑’ ) > isp (‘ - ’ ), 进 OPTR 栈, 取下一符号 s3 e ; -↑ 16 f 操作数  f 进 OPND 栈, 取下一符号 s3 e f ; -↑ 17 / 操作符  icp (‘ / ’ ) < isp (‘↑’ ), 退 OPND 栈 ‘f’, 退 OPND 栈 ‘e’, 退 OPTR 栈 ‘↑’, 计算 e↑f → s4, 结果 进 OPND 栈 s3 s4 ; - 18 同上 同上  icp (‘ / ’ ) > isp (‘ - ’ ), 进 OPTR 栈, 取下一符号 s3 s4 ; - / 19 g 操作数  g 进 OPND 栈, 取下一符号 s3 s4 g ; - / 20 ; 操作符  icp (‘ ; ’ ) < isp (‘ / ’ ), 退 OPND 栈 ‘g’, 退 OPND 栈 ‘s4’, 退 OPTR 栈 ‘/’, 计算 s4 / g → s5, 结果 进 OPND 栈 s3 s5 ; -
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有