【题解】Luogu1739 表达式括号匹配

2020-04-07 01:25:18来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

【题解】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";
}

再 次 吐 血

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

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

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

(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" << '\n';return 0;}
        if(c == '(')flag++;
        if(c == ')') flag --;
        if(before == '(' && c == '@'){std::cout << "NO" << '\n';return 0;}
        i++;
    }while(c != '@');
    std::cout << (!flag?"YES":"NO") << '\n';
}


还有?!再次点开数据:

(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" << '\n';return 0;}
        if(c == '(')flag++;
        if(c == ')')flag--;
        if(flag < 0){std::cout << "NO" << '\n';return 0;}
        if(before == '(' && c == '@'){std::cout << "NO" << '\n';return 0;}
        i++;
    }while(c != '@');
    std::cout << (!flag?"YES":"NO") << '\n';
}


坑的总结

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

留个赞再走会死吗


原文链接:https://www.cnblogs.com/sdltf/p/12651331.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:[题记-并查集] 合根植物 - 蓝桥杯

下一篇:STL之stack