NYOJ - 括号配对问题

描述
现在,有一行括号序列,请你检查这行括号是否配对。

输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有”[“,”]”,”(“,”)”四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes

看到网上对这道题的解释都是使用栈,确实使用栈比较方便快捷,但是发现用字符串做容器,配上计数器也是一个不错的选择。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
    int T;
    char str[10005];
    scanf("%d", &T);

    while (T--)
    {
        int flag = 1;
        int fz, fy, yz, yy;

        cin >> str;
        int len = strlen(str);
        fz = fy = yz = yy = 0;

        for (int i = 0; i < len; ++i)
        {
            switch (str[i])             //统计各种括号的数量
            {
                case '[' : fz++; break;
                case ']' : fy++; break;
                case '(' : yz++; break;
                case ')' : yy++; break;
            }
            if (i == 0)
                continue;
            //当括号为 ( 或者为 ] 时判断其合法性
            if (str[i] == ']' && str[i-1] == '(')
            {
                flag = 0;
                break;
            }
            else if (str[i] == ')' && str[i-1] == '[')
            {
                flag = 0;
                break;
            }
        }
        if (fz != fy || yz != yy)       //若是数量不对也是不合法的
            flag = 0;

        if (flag == 1) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

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