zoukankan      html  css  js  c++  java
  • 括号配对问题学习

    问题:

    描述
       现在,有一行括号序列,请你检查这行括号是否配对。
    输入
       第一行输入一个数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。二者有一为真,则不匹配

  • 相关阅读:
    LeetCode链表解题模板
    c++中的new、operator new、placement new
    树的前序、中序、后续、层次遍历的递归和非递归解法
    c++Volatile关键词
    南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题
    c++右值引用以及使用
    c++选择重载函数
    从4行代码看右值引用
    被遗忘的C结构体打包技术
    南大算法设计与分析课程OJ答案代码(4)--变位词、三数之和
  • 原文地址:https://www.cnblogs.com/zyqx/p/9170369.html
Copyright © 2011-2022 走看看