题目链接
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]; } }
总结
有点自己被自己绕晕的感觉,简单的数组模拟,我却想着用栈去模拟,也过多的考虑了匹配关系,直接顺着模拟下去就行,考虑太多反而容易出错。