括号配对问题学习

问题:

描述
   现在,有一行括号序列,请你检查这行括号是否配对。
输入
   第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", "]", "(", ")" 四种字符。
输出
  每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
参考代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>

using namespace std;

int main()
{
    int N;
    cin >>N;
    while (N --)
    {
        stack <char> stackChar;
        string A;
        bool judgeBrack=true;
        cin >>A;

        for (int i=0; i<A.size(); ++i)
        {
            if (A[i] == '[' || A[i] == '(') // 如果新放入的数据是[,(都进栈
            {
                stackChar.push(A[i]);//入栈
            }
            else
            {
                if(stackChar.empty())//????????????????????????
                {
                    judgeBrack = false;
                    break;//空输入,结束不判断
                }
                if ((A[i] == ']' && stackChar.top() == '[')
                    ||(A[i] == ')' && stackChar.top() == '('))
                        stackChar.pop();//输入的括号与栈里面的相匹配,把栈里的出栈
                else//其他情况为违法情况,跳出
                {
                    judgeBrack = false;
                    break;
                }
            }
        }

        //PS: 最后的判断中,如果stack里面还有字符也说明,是不匹配的 stackChar.size()
        (!judgeBrack || stackChar.size())? cout <<"No" <<endl: cout<< "Yes" <<endl;
    }
    return 0;
}

思路:

1) 用while循环输入所需要判断几个字符串符合

stack<char>stackChar//定义一个字符串的栈

bool judgeBrack=true//不合法时,为false

2)用for循环依次取得字符串a[i]

1.如果是‘(’‘【’‘{’合法,入栈stackChar.push(a[i])

2.如果是空,则返回judgeBrack为false

3.如果遇到 ']' or ')'判断stack.top()是否与其配对

4.其他情况都违法

3)该字符串循环完毕之后,判断栈是否为空以及judgeBrack。二者有一为真,则不匹配

原文地址:https://www.cnblogs.com/zyqx/p/9170369.html