单选题 利用栈求表达式的值时,设立运算数栈OPND。假设OPND只有两个存储单元,在下列表达式中,不发生溢出的是______。
A.A-B*(C-D) B.(A-B)*C-D
C.(A-B*C)-D D.(A-B)*(C-D)

【正确答案】 B
【答案解析】[解析] 利用栈求表达式的值时,将中缀表达式转换成后缀表达式以及进行后缀表达式求值这两步操作可以一起进行,需要设立运算符栈OPTR和运算数栈OPND两个栈。
例如求选项A的表达式A-B*(C-D)的过程如表1所列:
表1 求A-B*(C-D)表达式值的过程
当前字符 运算符栈OPTR 运算数栈OPND 说 明
A A
- - A
B - AB
* -* AB
( -*( AB
C -*( ABC
- -*(- ABC
D -*(- ABCD
) -* ABT1 执行C-D运算,令T1=C-D
- AT2 执行B*T1运算,令T2=B*T1
T3 执行A-T2运算,令T3=A-T2

  按照上述过程可知,选项A求值时,运算数栈OPND的大小至少为4。
  例如求选项B的表达式(A-B)*C-D的过程如表2所列:
表2 求(A-B)*C-D表达式值的过程
当前字符 运算符栈OPTR 运算数栈OPND 说 明
( (
A ( A
- (- A
B (- AB
) T1 执行A-B运算,令T1=A-B
* * T1
C T1C
- - T2 执行T1*C运算,令T2=T1*C
D - T2D
T3 执行T2-D运算,令T3=T2-D
按照上述过程可知,选项B求值时,运算数栈OPND的大小至少为2。
类似地,选项C、D求值时,运算数栈OPND的大小分别至少为3、3。因此本题答案为B。