zoukankan      html  css  js  c++  java
  • 【题解】Luogu1739 表达式括号匹配

    提示:

    这是一篇良心博客。
    在这里,你会看到所有你可能踩到的坑。
    所以,作者用这个方式来掩饰自己超蒻……


    踩坑路程

    一眼看过去,水题一个!随手写了这么一个代码:

    #include <bits/stdc++.h>
    int main(){
        char c;
        int flag = 0;
        while(c = getchar()&& c != '@'){
            if(c == '(')flag++;
            else if(c == ')') flag --;
        }
        std::cout << !flag?"YES":"NO";
    }
    

    结果:

    (艹测评机你不打脸会死啊喂)

    然后,改为do-while

    #include <bits/stdc++.h>
    int main(){
        char c;
        int flag = 0;
        do{
            c = getchar();
            if(c == '(')flag++;
            else if(c == ')') flag --;
        }while(c != '@');
        std::cout << !flag?"YES":"NO";
    }
    

    再 次 吐 血
    再次思考,考虑到:)(这种匹配方式,那么加个特判:

    #include <bits/stdc++.h>
    int main(){
        char c;
        int flag = 0,i = 0;
        do{
            c = getchar();
            if(!i && c == ')'){std::cout << "NO";return 0;}
            if(c == '(')flag++;
            if(c == ')') flag --;
            i++;
        }while(c != '@');
        std::cout << !flag?"YES":"NO";
    }
    

    再 次 吐 血

    无奈下载了一个数据看了下……
    艹!还有一个
    再次修改代码:

    #include <bits/stdc++.h>
    int main(){
        char c;
        int flag = 0,i = 0;
        do{
            c = getchar();
            if(!i && c == ')'){std::cout << "NO" << '
    ';return 0;}
            if(c == '(')flag++;
            if(c == ')') flag --;
            i++;
        }while(c != '@');
        std::cout << (!flag?"YES":"NO") << '
    ';
    }
    

    我…………
    再次点开一个数据:

    (a*2*3+1*2+3)+(3*2)+(1*2))1*1(@
                             ^   ^
    

    哦哦哦还有个特判!结尾'('的情况!
    再次修改:

    #include <bits/stdc++.h>
    int main(){
        char c = ' ',before;
        int flag = 0,i = 0;
        do{
            before = c;
            c = getchar();
            if(!i && c == ')'){std::cout << "NO" << '
    ';return 0;}
            if(c == '(')flag++;
            if(c == ')') flag --;
            if(before == '(' && c == '@'){std::cout << "NO" << '
    ';return 0;}
            i++;
        }while(c != '@');
        std::cout << (!flag?"YES":"NO") << '
    ';
    }
    


    还有?!再次点开数据:

    (0)*(2+2)*)3+4((3+10)@
    

    看到这个数据,我突然发现问题就在我的思路上,考虑不到)(这个情况。
    但是能不能顺着我的思路继续做呢?完 全 可 以。
    考虑到如果出现)(的话,会出现:

    flag = 0
    c = ) flag-- -> flag = -1
                           ^^
    

    负数!那么修改一下:

    #include <bits/stdc++.h>
    int main(){
        char c = ' ',before;
        int flag = 0,i = 0;
        do{
            before = c;
            c = getchar();
            if(!i && c == ')'){std::cout << "NO" << '
    ';return 0;}
            if(c == '(')flag++;
            if(c == ')')flag--;
            if(flag < 0){std::cout << "NO" << '
    ';return 0;}
            if(before == '(' && c == '@'){std::cout << "NO" << '
    ';return 0;}
            i++;
        }while(c != '@');
        std::cout << (!flag?"YES":"NO") << '
    ';
    }
    


    坑的总结

    • 没看到换行
    • (结尾的特判没注意
    • )(的情况flag依然等于0导致错误

    留个赞再走会死吗

  • 相关阅读:
    Scrum冲刺第一篇
    项目冲刺
    需求改进&系统设计
    需求规格说明书
    团队作业第五周-测试和发布
    冲刺集合贴
    冲刺第6天
    冲刺第7天
    冲刺第5天
    冲刺第四天
  • 原文地址:https://www.cnblogs.com/sdltf/p/12651331.html
Copyright © 2011-2022 走看看