阅读下列说明和算法,回答问题1和问题2,将解答填入答题纸的对应栏内。 [说明] 算法2-1是用来检查文本文件中的圆括号是否匹配。若文件中存在圆括号没有对应的左括号或者右括号,则给出相应的提示信息,如下所示: 文件 提示信息 (

admin2005-03-15  58

问题 阅读下列说明和算法,回答问题1和问题2,将解答填入答题纸的对应栏内。
   [说明]
   算法2-1是用来检查文本文件中的圆括号是否匹配。若文件中存在圆括号没有对应的左括号或者右括号,则给出相应的提示信息,如下所示:
   文件    提示信息
   (1+2)
         abc)                            缺少对应左括号:第2行,第4列
   ((def)8x))                            缺少对应左括号:第3行,第10列
   (((h)
   ij)(k
   (1ml)                                缺少对应右括号:第5行,第4列;第4行,第1列
   在算法2-1中,stack为一整数栈。算法中各函数的说明如表4-1所示。
   
   [算法2-1]
   将栈stack置空,置EOF为False
   ch←nextch();
   while(not EOF)
       k←kind(ch);
       if(k==(1))
          push((2));push((3));
      elself(k==(4))
          if(not empty())
              pop(),pop(),
          else
              显示错误信息(缺少对应左括号或右括号);
              显示行号row;显示列号col;
          endif
      endif
      ch←nextch();
   endwhile
   if(not empty())
     显示错误信息(缺少对应左括号或右括号);
     while(not empty())
         row←pop();col←pop();
         显示行号row;显示列号col
     cndwhile
  endif
   为了识别更多种类的括号,对算法2-1加以改进后得到算法2-2。算法2-2能够识别圆括号,方括号和花括号(不同类型的括号不能互相匹配)。改进后,函数kinnd(char ch)的参数及其对应的返回值如表4-2所示。
   表4-2  函数的参数及其返回值
   
   [算法2-2]
   将栈stack置空,置EOF为False
   ch←nextch();
   while(not EOF)
       k←kind(ch);
       if(k>0)
           if(  判断条件1  )
              push((5));push((6));push((7));
          elseif(  判断条件2  and  判断条件3  )
               pop();pop();pop();
          else
              显示错误信息(缺少对应左括号或右括号);
              显示行号row;显示列号col;
          endif
      endif
      ch←nexteh();
   endwhile
   if(not empty())
       显示错误信息(缺少对应左括号或右括号);
       while(not empty())
           pop();row←pop();col←pop();
           显示行号row;显示列号col;
       endwhile
   endif

选项

答案(1)1 (2)col (3)row (4)2 (5)col (6)row (7)k

解析 本程序的功能是检查文本文件中的圆括号是否匹配。从提示信息中,可以看出程序不但可以检查出是否有括号匹配错误,而且还知道具体错在哪个括号。由于括号匹配的规则是把最近的左右括号配成一对,所以括号匹配最常用的方法是遇到左括号则入栈,遇到右括号就出栈,出栈的友括号与当前的右括号是匹配的。此算法也不例外。
   下面具体分析算法:
   首先,把栈置空,置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。
转载请注明原文地址:https://kaotiyun.com/show/5yDZ777K
0

相关试题推荐
最新回复(0)