题意简要是:去掉文本中的 注释, /* */ 之间的为注释。和括号一样,有可能注释中包含注释。
使用栈解,当遇到/*时入栈,遇到*/时,出栈,并且删掉之间的字符。代码如下:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Stack;
public class HelloWorld {
public static void main(String[] args) {
try {
// BufferedReader br = new BufferedReader(new FileReader("D:/codejam/a.txt"));
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// BufferedReader br = new BufferedReader(new FileReader("D:/codejam/E-small-attempt0.in"));
// BufferedWriter bw = new BufferedWriter(new FileWriter("D:/codejam/E-small-result.txt"));
// BufferedReader br = new BufferedReader(new FileReader("D:/codejam/A-small-attempt1.in"));
BufferedReader br = new BufferedReader(new FileReader("D:/codejam/E-large-practice.in"));
BufferedWriter bw = new BufferedWriter(new FileWriter("D:/codejam/E-large-result.txt"));
String line;
for (int cas = 1; cas <= 1; cas++) {
StringBuilder sb = new StringBuilder();
for (; true; ) {
line = br.readLine();
if (line == null) break;
sb.append(line);
sb.append('\n');
}
Stack<Integer> s = new Stack<Integer>();
for (int i = 0;i < sb.length(); i++) {
if (sb.charAt(i) == '/') {
if (i+1 < sb.length()) {
if (sb.charAt(i+1) == '*') {
s.push(i);
i++;
continue;
}
}
}
if (sb.charAt(i) == '*' && i+1 < sb.length() && sb.charAt(i+1) == '/') {
if (!s.empty()) {
int newPlace = i+2;
int start = s.pop();
sb.delete(start, newPlace);
i = start - 1;
}
}
}
bw.write("Case #" + cas +":\n");
bw.write(sb.toString());
bw.flush();
}
br.close();
bw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}