括号匹配

括号的匹配

 

Time Limit:   1000MS       Memory Limit:   65535KB
Submissions:   428       Accepted:   68

 

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

解法一:用STL

# include<iostream>//用STL
# include<stdio.h>
# include<string.h>
# include<stack>
using namespace std;
char map[9] = {'<', '(', '[', '{', '>', ')', ']', '}'};
int main()
{
    int nCase,len,flag,i,j,sign;
    char str[500];
    scanf("%d",&nCase);
    while(nCase--)
    {
        stack<int> Num;
        flag = 0;
        scanf("%s",str);
        len= strlen(str);
        if(len%2==0)
        {
            for(i=0;i<len;i++) 
            {
                for(j=0;j<8;j++)
                {
                    if(str[i]==map[j])
                    {
                        
                        if(!Num.empty())
                        {
                            sign= Num.top();
                            if(sign>=j) Num.push(j);//判断顺序问题
                            else if(j==sign+4) Num.pop();//判断是否匹配
                            else 
                            {
                                flag=1;
                                break;
                            }
                        }
                        else Num.push(j);
                    }
                }
                if(flag) break;
            }
            if(!flag && Num.empty()) printf("YES\n");
            else printf("NO\n");
        }
        else printf("NO\n");
    }
    return 0;
}

 

解法二:直接写

 

# include<stdio.h>
# include<string.h>
# include<malloc.h>
# define Len sizeof(struct node) 
typedef int ElemType;
char map[8] = {'<', '(', '[', '{', '>', ')', ']', '}'};
typedef struct node
{
    ElemType data[500],top;
}SeqStack;
void InitStack(SeqStack *s)
{
    s->top=-1;
}
int EmptyStack(SeqStack *s)
{
    return s->top==-1;
}
void push(SeqStack *s,ElemType e)
{
    s->data[++s->top]=e;
}
void pop(SeqStack *s)
{
    s->top--;
}
int main()
{
    SeqStack *s;
    int nCase,leap,i,j,len,sign;
    char str[500];
    scanf("%d",&nCase);
    while(nCase--)
    {
        leap=0;
        s=(SeqStack *)malloc(Len);
        InitStack(s);
        scanf("%s",str);
        len=strlen(str);
          for(i=0;i<len;i++)
          {
              for(j=0;j<8;j++)
              {
                  if(str[i]==map[j])
                  {
                  if(!EmptyStack(s))
                  {
                      sign=s->data[s->top];
                      if(sign>=j)push(s,j);
                      else if(j==sign+4)pop(s);
                      else 
                      {
                          leap=1;
                          break;
                      }
                  }
                  else
                     push(s,j);
                  }
              }
                  if(leap)break;
          }
          if(!leap&&EmptyStack(s))printf("YES\n");
            else printf("NO\n");
            free(s);
    }
    return 0;
}

 

posted on 2012-05-31 11:22  即为将军  阅读(1031)  评论(0)    收藏  举报

导航