括号序列(5倍经验)

点击送萝莉

题目描述 Description

定义满足以下规则字符串为规则序列,否则不是规则序列:

1.空序列是规则序列;

2.如果S是规则序列,那么(S),[S],{S}和也是规则序列;

3.如果A和B都是规则序列,那么AB也是规则序列。

例如,下面的字符串都是规则序列:

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

而以下几个则不是:

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

现在,给你一些由”(“、”)”、”[“、”]”、”{“、”}”、”<”、”>”构成的字符串,请判断该字符串是否为规则序列。

输入描述 Input Description

第一行:一个正整数N,表示测试数据组数;

接下来N行:每行一个括号序列(长度不超过L)。
输出描述 Output Description

共N行:对于每一个括号序列,判断其是否规则。

规则输出TRUE,否则输出FALSE。
样例输入 Sample Input

2

{()}<<>>

{{{{{}}}}
样例输出 Sample Output

TRUE

FALSE

首先我们先看某cy的一个错误的解法:
统计每个括号,比较匹配括号的出现次数是否相同。
然后。())( 就把他卡死了。
然后正解
正解就是统计的时候判断右括号出现前左括号的出现次数是否大于等于右括号出现次数+1就行了2333333333


#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char z[9999999];
char temp[9999999];
int f[9999999];
int main()
{
  int a,n,c,shuzu=0;
  cin>>n;
  for(c=1;c<=n;c++)
  {
    scanf("%s",z);
    int chang,zhi=0,judge=1;
    chang=strlen(z);
    for(a=0;a<=chang-1;a++)
    {
       if(z[a]=='('||  z[a]=='['||  z[a]=='{'||  z[a]=='<')
       {temp[++zhi]=z[a];continue;}
       if(z[a]==')'||  z[a]==']'||  z[a]=='}'||  z[a]=='>')
       {
          if( (z[a]==')'&&temp[zhi]=='(')  ||  (z[a]==']'&&temp[zhi]=='[')  ||  (z[a]=='}'&&temp[zhi]=='{')  ||  (z[a]=='>'&&temp[zhi]=='<') )
            {temp[zhi]='\0';zhi--;continue;}
          else{judge=0;break;}
       }                    
    }
    if(zhi!=0)judge=0;
    if(judge==1)f[++shuzu]=1;
    if(judge==0)shuzu++;                 
  }
  for(int w=1;w<=shuzu;w++)
  {
    if(f[w]==1)cout<<"TRUE"<<endl;
    else cout<<"FALSE"<<endl;      
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值