问答题 试编写一个算法,检查一个程序中的花括号、方括号和圆括号是否配对,若能够全部配对则返回1,否则返回0。
【正确答案】
【答案解析】在算法中,扫描程序中的每一个字符,当扫描到花、中、圆左括号时,令其进栈,当扫描到花、中、圆右括号时,则检查栈顶是否为相应的左括号,若是则作退栈处理,若不是则表明出现了语法错误,应返回0。当扫描到程序文件结尾后,若栈为空则表明没有发现括号配对错误,应返回1,否则表明栈中还有未配对的括号,应返回0。另外,对于一对单引号或双引号内的字符不进行括号配对检查。
根据分析,编写出算法如下:
int BracketsCheck (char * f){
//对由f所指字符串中的文本进行括号配对检查
stack S;char ch; //定义一个栈
char * p=f;
while(*p!="\0"){ //顺序扫描字符串中的每一个字符
if ( * p==39){ //单引号内的字符不参与配对比较
while ( * p!="\0"&&"P!=39) //39为单引号的ASCII值、p++;
}
else if( * p!="\0"&& * p==34){ //双引号内的字符不参与配对比较
while( * p!="\0"&& * p!=34) //34为双引号的ASCII值p++;
}
if ( * p!="\0"){
switch ( * p){
case"{":case"[":case"(":push(S, * p);break; //左括号进栈
case"}":getTop(S,ch);
if(ch=="{")pop(S,ch); //栈顶的左花括号出栈
else return(0);break;
case"]":getTop(S,ch);
if(ch=="[")pop(S,ch); //栈顶的左中括号出栈
else return(0);break;
case")":getTop (S,ch);
if (ch=="(")pop (S,ch); //栈顶的左圆括号出栈
else return(0);
}
p++;
}
if (isEmpty(S)) return (1);
else return (0);
}
}