问题 问答题

[问题1] 试将[算法2-1)和[算法2-2]中(1)~(7)处补充完整。[问题2] 从下面的选项中选择相应的判断逻辑填补[算法2-2]中的“判断条件1”至“判断条件 3”。注意,若“判断条件2”的逻辑判断结果为假,就无需对“判断条件3”进行判断。 (a)字符是括号(b)字符是左括号(c)字符是右括号(d)栈空(e)栈不空 (f)栈顶元素表示的是与当前字符匹配的左括号 (g)栈顶元素表示的是与当前字符匹配的右括号

答案

参考答案:

解析:1 (2)col (3)row (4)2 (5)col (6)row (7)k 判断条件1:(b) 判断条件2:(e) 判断条件3:(f)

[分析]: 本程序的功能是检查文本文件中的圆括号是否匹配。从提示信息中,可以看出程序不但可以检查出是否有括号匹配错误,而且还知道具体错在哪个括号。由于括号匹配的规则是把最近的左右括号配成一对,所以括号匹配最常用的方法是遇到左括号则入栈,遇到右括号就出栈,出栈的友括号与当前的右括号是匹配的。此算法也不例外。 下面具体分析算法: 首先,把栈置空,置EOF为False,并从文件中读取第一个字符到ch。然后进入循环,循环体执行一次处理一个ch。进入循环,利用kind函数算出ch的类型k,接下来就是一大堆的空了,这个算法本身并不长,但空有这么多,而且比较集中,为解题增加了一定的难度。这里虽然空多,但基本结构却很明显,大致流程如下: 当k等于什么的时候把什么入栈,当k等于什么的时候且栈不为空的时候出栈,如栈为空打印错误信息,如果都不是则读文件下一个字符再次进入循环。 再结合上面提到的算法,可以知道,入栈应是在类型k为1(即ch为左括号时),出栈应是在类型k为2(即ch为右括号时)。所以(1)空应填1,(4)空应填2。 (2)和(3)到底是把什么压入栈了呢在(4)下面出栈时,并没有用到栈的内容。在此有些考生理所当然地认为栈中的内容没有什么用,随便压个ch进去了,而且2个都是写的ch。其实从逻辑上就可以推翻这种解答,如果是压的同样的数据,又是在同一位置出栈,算法大可只用个push,pop就可以了。这时继续往后面看,来寻找正确的答案。当看到“row<-pop();col<-pop();”时,所有的疑惑可迎刃而解了,应该把row和col压入堆栈!那么row和col谁先谁后呢由于是先弹出row后弹出col,按栈的后进先出的规则,可知先压入栈的是col,再压入row。所以(2)空填写col,(3)空填写row。 完成[算法2-1]的分析后,分析[算法2-2]就比较轻松了。(5)(6)(7)空的答案可直接到后面找到,因为后面有“pop();row<-pop();col<-pop();”所以(5)空应填col,(6)空应填row。 因为判断条件1为真时要人栈,所以判断条件1应是判断字符是否是左括号,如果是就入栈。所以判断条件1选b。 判断条件2和3是联系在一起的,当判断条件2和3都为真时,要进行出栈操作,因此要判断栈是否为空。由此可以得出判断条件2和3中,有一个是用来判断栈是否为空的。 备选答案的一些选项给了一些提示,就是用判断栈顶元素,来确定当前括号是否和栈中压人括号是同一类型的。但前提是左括号类型入了栈,而且要在栈顶,如果(7)空压入的是k,就正好吻合了。所以(7)空应填k,判断括号是否匹配的条件也就可以确定了。如果当前ch是右括号且当前栈顶的左括号(只有左括号入了栈)类型与ch匹配,则匹配成功。因为在题目中有提示“若判断条件2”的逻辑判断结果为假,就无需对“判断条件3”进行判断。所以应把“栈不空”作为判断条件2,“栈顶元素表示的是与当前字符匹配的左括号”作为判断条件3。即判断条件2填e,判断条件3填f。

单项选择题 A3/A4型题
单项选择题