codevs 2058 括号序列

来源:互联网 发布:阿里云os root工具 编辑:程序博客网 时间:2024/04/28 05:28

题目描述 Description

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

1.空序列是规则序列;

2.如果S是规则序列,那么(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

数据范围及提示 Data Size & Hint

对于40%数据,有N=1,0<L<=20;
对于80%数据,有0<N<=5,0<L<=10^3;
对于100%数据,有0<N<=10,0<L<=2*10^6。

栈的简单应用,注意去栈顶元素时,需先判断栈是否为空。

/*作者:1094618304@qq.com题目:p2058 括号序列*/#include<cstdio>#include<cstring>#include<stack>using namespace std;char a[2000005];int main(){    int n,i,l,flag;    stack<char>s;    scanf("%d",&n);    getchar();    while(n--)    {        flag=0;        while(!s.empty()) s.pop();        scanf("%s",a);        l=strlen(a);        for(i=0;i<l;i++)        {            if(a[i]=='('||a[i]=='['||a[i]=='<'||a[i]=='{')                s.push(a[i]);            else if(!s.empty()&&(a[i]==')'&&s.top()=='('||a[i]==']'&&s.top()=='['||a[i]=='>'&&s.top()=='<'||a[i]=='}'&&s.top()=='{'))                s.pop();            else {flag=1;break;}        }        if(!flag&&s.empty()) printf("TRUE\n");        else printf("FALSE\n");    }    return 0;}


 

0 0