您的位置:首页 > 其它

COJ 1065括号匹配:栈的简单应用

2013-09-28 16:11 691 查看

[STL]【数据结构】括号匹配

Time Limit: 1000 ms Memory Limit: 65536 KB

Total Submit: 43 Accepted: 11

Description
数据有一行,由(,),[,],{,}六种字符构成。现在判断这行括号是否合法,合法条件如下:

1、每个左括号都有对应的右括号匹配,不得有多余的括号,比如这样正确:{}(),但这样错误:()())

2、不同类型括号之间不可以交错,比如这样正确:{[]},但这样错误:{[}]

Input
一行,只有六种括号字符

Output
括号合法输出:YES

括号不合法输出:NO

Sample Input
Sample Input 1:

{}{}{}()(){[]}

Sample Input 2:

{}[]]{[})())

Sample Output
Sample Output 1:

YES

Sample Output 2:

NO

Hint


如采用逐个字符输入时,建议使用getchar();

<stack>

思路:被getchar一直TLE,后面改用字符串输入就得过了,真是很无语有木有!!!暗示居然还是个陷阱……唉……中间也没看好题目,理解错了又错了几次,刚开始还以为{[}]这样也属于匹配的,后面重新看题目了才知道理解错了,一直纠结这事……

#include<iostream>
#include<stack>
#include<cstdio>
#include<cstring>
using namespace std;
int cmp(char a,char b)
{
    if(a=='{'&&b=='}') return 1;
    if(a=='('&&b==')') return 1;
    if(a=='['&&b==']') return 1;
    return 0;
}
int main()
{
    stack<char>s;
    char c[101];
    int i,l;
    scanf("%s",c);
    l=strlen(c);
    for(i=0;i<l;i++)
    {
        if(!s.empty()&&cmp(s.top(),c[i]))
            s.pop();
        else s.push(c[i]);
    }
    if(!s.empty()) printf("NO\n");
    else printf("YES\n");
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: