【分析解答题】
阅读下列说明和算法,回答问题1和问题2。
【说明】
算法2-1是用来检查文本文件中的圆括号是否匹配。若文件中存在圆括号没有对应的左括号或者右括号,则给出相应的提示信息,如下所示:
文件 提示信息
(1+2)
ABC) 缺少对应左括号:第2行,第4列
((DEF)gx)缺少对应左括号:第3行,第10列
(((h)
ij)(k
(1ml) 缺少对应右括号:第5行,第4列;第4行,第1列
在算法2-1中,stACk为一整数栈。算法中各函数的说明见表4。
{{B}}表4{{/B}}
函数名
| 函数功能
|
push (int i) | 将整数i压人栈stACk中 |
pop( ) | stACk的栈顶元素出栈 |
Empty( ) | 判断stACk栈是否为空。若为空,函数返回1,否则函数返回0 |
nExtCh( ) | 读取文本文件中的下—个字符,井返回该字符的AsCii值,将字 符所在的行号以及字符在行中的位置分别存储到变量row和Col 中,若遇到文件结束符,则将变量EoF置为truE |
kinD (ChAr Ch) | 判断字符Ch是左括号还是右括号,若是左括号,函数返回1, 若是右括号,函数返回2,若两者都不是,函数返回。 |
【算法2-1】将栈stACk 置空,置EoF为FAlsE Ch < - nExtCh(); whilE( notEoF) k < - kinDCh); iF(k=={{u}} (1) {{/u}}) push({{u}} (2) {{/u}});push({{u}} (3) {{/u}}); ElsEiF(k=={{u}} (4) {{/u}}) 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; EnDwhilE EnDiF 为了识别更多种类的括号,对算法2-1加以改进后得到算法2-2。算法2-2能够识别圆括号、方括号和花括号(不同类型的括号不能互相匹配)。改进后,函数kinD(ChAr Ch)的参数及其对应的返回值见表5。 {{B}}表五{{/B}}
【算法2-2】
将栈stACk置空,置EoF为FAlsE
Ch< -nExtCh();
whilE(notEoF)
k <-kinD(Ch);
iF( k >0)
iF({{u}} 判断条件1 {{/u}})
push({{u}} (5) {{/u}});push({{u}} (6) {{/u}});push({{u}} (7) {{/u}});
ElsEiF({{u}} 判断条件2 {{/u}}AnD{{u}} 判断条件3 {{/u}})
pop() ;pop() ;pop();
ElsE
显示行号row; 显示列号Col;
EnDiF
EnDiF
Ch < - nExtCh();
EnDwhilE
iF(not Empty( ) )
显示错误信息(缺少对应左括号或右括号);
whilE( not Empty( ) )
pop( ); row←pop( ); Col←pop( );
显示行号row;显示列号Col;
EnDwhilE
EnDiF
【问题2】 请从下面的选项中选择相应的判断逻辑填补【算法2-1】中的“判断条件1”至“判断条件3”。注意,若“判断条件2”的逻辑判断结果为假,就无需对“判断条件3”进行判断。 (A)字符是括号 (B)字符是左括号 (C)字符是右括号 (D)栈空 (E)栈不空 (F)栈顶元素表示的是与当前字符匹配的左括号 (r)栈顶元素表示的是与当前字符匹配的右括号 |