NYOJ - 括号配对问题

描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes

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


#include 
#include 
#include 
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;
}



你可能感兴趣的:(ACM)