●試題4
閱讀下列說明和算法,回答問題1和問題2,將解答填人答題紙的對應欄內。
【說明】
算法2一l可以用來檢查某文本文件中的尖括號是否匹配。若文件中存在尖括號沒有對應的左括號或者右括號,則給出相應的提示信息,如下所示:
文件提示信息
head>缺少對應左括號:第2行,第5列
< top HREF=”+urlresuh+”>>>缺少對應左括號:第3行,第10列
<<
><
缺少對應右括號:第5行,第2列;第4行,第1列
在算法2—1中,stack為一整數(shù)棧。算法中各函數(shù)的說明見表5.3。
表5.3
函數(shù)名 | 函數(shù)功能 |
push(int i) | 將整數(shù)i壓入棧stack中 |
pop() | stack的棧頂元素出棧 |
isEmpty() | 判斷stack棧是否為空。若為空,函數(shù)返回1,否則函數(shù)返回0 |
nextChar() | 讀取文本文件中的下一個字符,并返回該字符的ASCIl值,將字符所在的行號以及字符在行中的位置分別存儲到變量row和col中,若遇到文件結束符,則將變量EOF置為true |
type(char ch) | 判斷字符ch是左括號還是右括號,若是左括號,函數(shù)返回1,若是右括號,函數(shù)返回2,若兩者都不是,函數(shù)返回0 |
【算法2—1】
將棧stack置空,置EOF為false
ch<一nextChar();
while(not EOF)
k<一type(CH);
if(k==(1))
push((2));push((3));
else if(k==(4))
if(not isEmpty()) pop();pop();
else
顯示錯誤信息(缺少對應左括號或右括號);
顯示行號low;顯示列號col;
endif endif ch<一nextChar();
endwhile
if(not isEmpty())
顯示錯誤信息(缺少對應左括號或右括號);
while(not isEmpty())
row<一pop();col<一pop();
顯示行號row;顯示列號col;
endwhile
endif
為了識別更多種類的括號,對算法2一1加以改進后得到算法2—2。算法2—2能夠識別圓括號、方括號和花括號(不同類型的括號不能互相匹配)。改進后,函數(shù)type(chat ch)的參數(shù)及其對應的返回值見表5.4。
表5.4
ch |
( |
) |
{ |
} |
[ |
] |
其他 |
返回值 |
1 |
2 |
3 |
4 |
5 |
6 |
0 |
【算法2—2】
將棧stack置空,置EOF為false
ch<一nextChar();
while(not EOF) k<一type(ch);
if(k>0)
if(判斷條件1)
push((5));push((6));push((7));
elseif(判斷條件2and判斷條件3)
pop();pop();pop();
else
顯示錯誤信息(缺少對應左括號或右括號);
顯示行號row;顯示列號col;
endif
endif
ch<一nextChar();
endwhile
if(not isEmpty())
顯示錯誤信息(缺少對應左括號或右括號);
while(not isEmpty())
pop();row←pop();col←pop();
顯示行號row;顯示列號col;
endwhile
endif
【問題1】
請將【算法2—1】和【算法2—2】中(1)~(7)處補充完整。
【問題2】
請從下面的選項中選擇相應的判斷邏輯填補【算法2—2】中的“判斷條件1”至“判斷條件3注意,若“判斷條件2”的邏輯判斷結果為假,就無需對“判斷條件3”進行判斷。
(a)字符是括號
(b)字符是左括號
(c)字符是右括號
(d)棧空
(e)棧不空
(f)棧頂元素表示的是與當前字符匹配的左括號
(g)棧頂元素表示的是與當前字符匹配的右括號
【問題1】解答:
(1)1 類型為左括號時入棧。
(2)col 先壓入col
(3)row 后壓入lOW
(4)2 類型為右括號時出棧。
(5)col 先彈出col
(6)row 后彈出row
(7)k
【問題2】解答:
判斷條件l:(b)判斷字符是否是左括號
判斷條件2:(e)棧是否空
判斷條件3 1(f)棧頂元素表示的是否是與當前字符匹配的左括號
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |