题目链接

https://www.dotcpp.com/oj/problem1507.html

题目大意

输入一串字符串,去掉注释部分。注释部分分为两种“//”和“/**/”。

解题思路

模拟!
(我想的是用栈模拟,类似于括号配对。但是发现有好多种情况我都不知道如何去实现,比如“/* /”到底是匹配前面的“/ *”还是匹配后面的“ */”,还有“// */”又如何匹配?最后把自己绕糊涂了。注释符中没空格,博客问题,不得已加上空格,下同)
正确模拟:
先用数组直接存下这些字符。
再顺序循环,进行判断;若发现“//”,直到找到空格为止;若发现“/ *”,再去后面找“ */”。只有当循环到的字符不在上述讨论的两个部分中时,直接输出就行。
正好也解决了上述中我的疑惑点,注释符的匹配一般是后面的去匹配前面的,也就是前面的“优先级”高。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int len;
int main(){
    char c;
    char str[N];
    while((c=getchar())!=EOF){
        str[len++]=c;
    }

    for(int i=0;i<len;i++){
        if(i+1<len && str[i]=='/' && str[i+1]=='/'){//
            for(int j=i+2;j<len;j++)
                if(str[j]=='\n'){i=j-1;break;}            
        }
        else if(i+1<len && str[i]=='/' && str[i+1]=='*'){/**/
            for(int j=i+2;j<len;j++)
                if(j+1<len && str[j]=='*' && str[j+1]=='/'){i=j+1;break;}
        }
        else cout<<str[i];
    }
}

总结

有点自己被自己绕晕的感觉,简单的数组模拟,我却想着用栈去模拟,也过多的考虑了匹配关系,直接顺着模拟下去就行,考虑太多反而容易出错。