问答题 阅读以下说明和图4-6,回答问题1至问题4。【说明】 本流程图(如图4-6所示)是将中缀表示的算术表达式转换成后缀表示。如中缀表达式 (A-(B*C+D)*E)/(F+G)的后缀表示为ABC*D+E*-FG+/。为了方便,假定变量名为单个英文字母,运算符只有+、-、*、/(均为双目运算符,左结合),并假定所提供的算术表达式非空且语法是正确的。另外,中缀表示形式中无空格符,但整个算术表达式以空格符结束。流程图中使用的符号的意义如下。 . 数组IN[]存储中缀表达式。 . 数组POLISH[]存储其后缀表示。 . 数组S[]是一个后进先出栈。 函数PRIOR(CHAR)返回符号CHAR的优先级,各符号的优先级如表4-4所示。
问答题 填充流程图中①的判断条件。
【正确答案】正确答案:PRIOR(IN[i]):PRIOR(S[p])
【答案解析】
问答题 写出子程序A的功能,并顺序写出实现该功能的操作。
【正确答案】正确答案:功能:将当前符号IN[i]入栈。 操作:P+1→P IN[i]→S[p]
【答案解析】
问答题 写出子程序B的功能,并顺序写出实现该功能的操作。
【正确答案】正确答案:功能:出栈(将栈顶元素送往数组POLISH[]) 操作:k+1→k S[p]→POLISH[k] p-1→p
【答案解析】
问答题 中缀表达式(A+B-C*D)*(E-F)/G经该流程图处理后的输出是什么?
【正确答案】正确答案:AB+CD*-EP-*G/
【答案解析】解析:流程图中借助栈S[](其实是数组,栈顶p指向最后一个元素),相应的栈操作如下。进栈:p+1→p、入栈元素→S[p]:出栈:S[p]→栈元素变量、p-1→p:栈空条件:p=0。 流程图中采用了3个下标变量k、p、i,容易判断i是输入数组IN[]的下标,k是输出数组 POLISH[]的下标,p是栈S[]的栈顶下标。 整个循环结束的条件是遇到空格字符,即表示中缀表达式结束。然后根据S[i]的不同进行不同的操作。 ①是变量,则将变量保存到输出数组中。 ②是左括号,则调用A(A未知,这正是难点所在)。 ③是右括号,则循环调用B,直到栈顶元素是左括号,意味着需要修改栈顶指针;将p-1→P,即进行一次出栈操作,但不关心栈顶元素,其实此时栈顶元素就是左括号。 ④是运算符,首先判断栈是否为空,若空则直接调用A;若非空,则进行某种大小比较(判定(1),这里容易想到是进行优先级比较),当小于等于时调用B,继续判断下一个栈顶元素,否则调用A。 从对右括号的处理可得,左括号一定要入栈,也就是说A一定包含左括号入栈操作;B含义出栈操作,栈顶元素做何种处理待定。再结合输出结果前的一个循环:循环调用B直到栈空。如果输入中缀式正确的话,此时栈中不可能含有括号,只可能含有运算符,因此应该是将剩余运算符送入输出数组POLISH[]中。这就是对栈顶元素的处理。 判定(1)猜想是进行优先级比较:将当前运算符与栈顶元素进行比较,若当前元素优先级高(>),则不出栈,将当前运算符入栈;否则(≤),出栈并处理栈顶元素,再将当前运算符入栈。 至于[问题4],则比较容易,只要知道后缀式的含义就能解答。