括号的匹配(c语言数据结构)

Description

题意描述:
  在算术表达式中,除了加、减、乘、除等运算外,往往还有括号。包括有大括号{},中括号[],小括号(),尖括号<>等。
  对于每一对括号,必须先左边括号,然后右边括号;如果有多个括号,则每种类型的左括号和右括号的个数必须相等;对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号。例如,{[()]},{()},{{}}为一个合法的表达式,而([{}]),{([])},[{<>}]都是非法的。

Input

  文件的第一行为一个整数n(1≤n≤100),接下来有n行仅由上述四类括号组成的括号表达式。第i+1行表示第i个表达式。每个括号表达式的长度不超过255。

Output

  在输出文件中有N行,其中第I行对应第I个表达式的合法性,合法输出YES,非法输出NO。

Sample Input

5  
{[(<>)]} 
[()] 
<>()[]{} 
[{}] 
{()}

Sample Output

  YES
  YES
  YES
  NO
  YES

Source   对于每一对括号,必须先左边括号,然后右边括号;如果有多个括号,则每种类型的左括号和右括号的个数必须相等;对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号。例如,{[()]},{()},{{}}为一个合法的表达式,而([{}]),{([])},[{<>}]都是非法的。



这个是到AC题目,这个题目要求括号要匹配,书本上只讲要求括号匹配就好了,比如{}{}[](),这样都是正确的匹配方式,而错误的匹配方式则是错误的:如{,}{,[]{],(}{)这样的都是错误的.

书上用栈做起来确实很方便,而且思路也比较好,利用栈的先进后出原理,把{[(<这样的形式压入栈,把}])>这样的取栈顶元素比较,相同则出栈,不同则不匹配.这样做起来确实明了,很好.

1.自己用数组也写了个,源码如下(只检查括号匹配,不检查优先级):

#include<stdio.h>
void main()
{
 char arr[256];
 int n,i,j,falt=0;
 scanf("%d\n",&n);
 while(n--){
  gets(arr);
  if(arr[0]=='}'||arr[0]==']'||arr[0]==')'||arr[0]=='>')
   printf("NO\n");
  else{
   for(i=0;arr[i]!='\0';i++){
    switch(arr[i]){
     case '}': if(arr[i-1]=='{'){
        for(j=i-1;arr[j]!='\0';j++){
         arr[j]=arr[j+2];
        }
        i=i-2;
       }
      else{
       falt=1;
       goto ll;
      }break;
     case ']':if(arr[i-1]=='['){
        for(j=i-1;arr[j]!='\0';j++){
         arr[j]=arr[j+2];
        }
        i=i-2;
       }
      else{
       falt=1;
       goto ll;

      }break;
     case ')': if(arr[i-1]=='('){
        for(j=i-1;arr[j]!='\0';j++){
         arr[j]=arr[j+2];
        }
        i=i-2;
       }
      else{
       falt=1;
       goto ll;
      }break;
     case '>': if(arr[i-1]=='<'){
        for(j=i-1;arr[j]!='\0';j++){
         arr[j]=arr[j+2];
        }
        i=i-2;
       }
      else{
       falt=1;
       goto ll;
      }break;
    }
   }//for
   if(arr[0]=='\0'){
    printf("YES\n");
  }
  else {
   printf("NO\n");
   }
   
  }//else
  
ll:if(falt==1){
    printf("NO\n");
  falt=0;
   }
 }//while
}//main

2.这道题目正确的解,符合优先级考虑:


#include<stdio.h>
void main()
{
 char arr[256];
 int n,i,j,falt=0,k;
 scanf("%d\n",&n);
 while(n--){
  gets(arr);
  if(arr[0]=='}'||arr[0]==']'||arr[0]==')'||arr[0]=='>')
   printf("NO\n");
  else{
   for(i=0;arr[i]!='\0';i++){
    k=i;
    switch(arr[i]){
    case '}': while(k--){
       if(arr[k]=='<' || arr[k]=='('|| arr[k]=='['){
        falt=1;
        goto ll;
       }
        }
      if(arr[i-1]=='{'){
        for(j=i-1;arr[j]!='\0';j++){
         arr[j]=arr[j+2];
        }
        i=i-2;
       }
      else{
       falt=1;
       goto ll;
      }break;
     case ']':while(k--){
       if(arr[k]=='<' || arr[k]=='('){
        falt=1;
        goto ll;
       }
        }
      if(arr[i-1]=='['){
        for(j=i-1;arr[j]!='\0';j++){
         arr[j]=arr[j+2];
        }
        i=i-2;
       }
      else{
       falt=1;
       goto ll;

      }break;
     case ')':while(k--){
       if(arr[k]=='<'){
        falt=1;
        goto ll;
       }
        }
      if(arr[i-1]=='('){
        for(j=i-1;arr[j]!='\0';j++){
         arr[j]=arr[j+2];
        }
        i=i-2;
       }
      else{
       falt=1;
       goto ll;
      }break;
     case '>': if(arr[i-1]=='<'){
        for(j=i-1;arr[j]!='\0';j++){
         arr[j]=arr[j+2];
        }
        i=i-2;
       }
      else{
       falt=1;
       goto ll;
      }break;
    }
   }
   if(arr[0]=='\0'){
    printf("YES\n");
  }
  else {
   printf("NO\n");
   }
   
  }
  
ll:if(falt==1){
    printf("NO\n");
  falt=0;
   }
 }
}
 

 

    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/qiumin333/article/details/8286012
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞