括号匹配检查

括号匹配检查

编写一程序检查C源程序文件中{}、()等括号是否匹配,并输出第一个检测到的不匹配的括号及所对应括号所在的行号(程序中只有一个括号不匹配)。

需要忽略这里的括号:单行注释//(()),和多行注释/*(){}*/,以及字符串常量 "function();" 和字符常量')'

三种检查错误方法:

1.当检测的程序括号为'{'时,若其前序尚未匹配的括号为'('时,输出该'('左括号及所在行号;

2.当遇到一个不匹配的右括号')'或'}'时,输出该右括号及所在行号;

3.当程序处理完毕时,还存在不匹配的左括号时,输出该左括号及所在行号。

我的步骤是:

  1. 按照字符读取文件,用结构体数组存放括号和行号

     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 = 行数;
     }
  2. 接着用栈去,判断结果。将数组的元素逐个入栈,同时进行判断。

     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]);//入栈
             }
         }
     }
  3. 最后处理完毕,检查是否有剩余的括号。

     //如果栈空,输出brk数组元素,否则输出栈顶元素。
     if(isEmpty()){
         for(i = 0;i<lenbrk;i++){
             printf("%c",brk[i].amount);
         }
     }else{
        //输出栈顶不匹配。 
     }

Last updated

Was this helpful?