括号匹配检查
括号匹配检查
编写一程序检查C源程序文件中{}、()等括号是否匹配,并输出第一个检测到的不匹配的括号及所对应括号所在的行号(程序中只有一个括号不匹配)。
需要忽略这里的括号:单行注释//(()),和多行注释/*(){}*/,以及字符串常量 "function();" 和字符常量')'。
三种检查错误方法:
1.当检测的程序括号为'{'时,若其前序尚未匹配的括号为'('时,输出该'('左括号及所在行号;
2.当遇到一个不匹配的右括号')'或'}'时,输出该右括号及所在行号;
3.当程序处理完毕时,还存在不匹配的左括号时,输出该左括号及所在行号。
我的步骤是:
按照字符读取文件,用结构体数组存放括号和行号
typedef struct{ int value;//char value; int line; }bracket; bracket brk[MAXN];freopen("example.c", "r", stdin); while((c=getchar())!=EOF){ if(c is \n)//换行符 { 行数++; continue; } if(c is ')//单引号 { while(getchar()!='\'');//一直读到第二个单引号 continue; } if(c is ")//双引号 { while(getchar()!='\"');//一直读取到第二个双引号 continue; } if(c is /){ c = getchar();//判断下一个是不是/或* if(c is *){ for(a = getchar(),b = getchar();!(a=='*'&&b=='/');a=b,b=getchar()){ if(a=='\n') 行数++; }; } if(c is /){ 一直读取到行尾,行数++; } } 最后需要判断是否为括号{()},如果是括号,就存入数组中。 brk[len].value = c; brk[len++].line = 行数; }接着用栈去,判断结果。将数组的元素逐个入栈,同时进行判断。
for(i = 0;i < len ; i++){ if(栈空){ push(brk[i]); }else{ //判断brk[i]和栈顶元素是否匹配: if( 匹配,栈顶元素左括号和brk[i]右括号对应 ){ pop(); }else if(stk.data[stk.top].value == '(' && brk[i].value == '{'){ //输出 ( 不匹配 return 0; }else if(brk[i].amount == ')' || brk[i].amount == '}'){ //输出右括号不匹配; return 0; }else{ push(brk[i]);//入栈 } } }最后处理完毕,检查是否有剩余的括号。
//如果栈空,输出brk数组元素,否则输出栈顶元素。 if(isEmpty()){ for(i = 0;i<lenbrk;i++){ printf("%c",brk[i].amount); } }else{ //输出栈顶不匹配。 }
Last updated
Was this helpful?