题目描述 P1928外星密码
有了防护伞,并不能完全避免 2012 的灾难。地球防卫小队决定去求助外星种族的帮 助。经过很长时间的努力,小队终于收到了外星生命的回信。但是外星人发过来的却是一 串密码。只有解开密码,才能知道外星人给的准确回复。解开密码的第一道工序就是解压 缩密码,外星人对于连续的若干个相同的子串“X”会压缩为“[DX]”的形式(D 是一个整 数且 1≤D≤99),比如说字符串“CBCBCBCB”就压缩为“[4CB]”或者“[2[2CB]]”,类 似于后面这种压缩之后再压缩的称为二重压缩。如果是“[2[2[2CB]]]”则是三重的。现 在我们给你外星人发送的密码,请你对其进行解压缩。
输入格式
第一行:一个字符串
输出格式
第一行:一个字符串
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
char c[] = reader.readLine().trim().toCharArray();
Stack<String> stack = new Stack<>();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < c.length; i++) { // 如果栈为空
if (stack.isEmpty()) {
// 如果是[,直接进栈
if (c[i] == '[') {
stack.add("[");
} else {// 否则直接加入结果串
sb.append(c[i]);
}
} else { // 栈不为空
// 如果是[,直接进栈
if (c[i] == '[') {
stack.add("[");
} else {
if (c[i] >= '0' && c[i] <= '9') {
// 如果是数字有两种情况;
if (stack.peek().equals("[")) {
// 如果是一位数
stack.add(c[i] + "");
} else {
// 如果是两位数
String str = stack.peek();
stack.pop();
stack.add((str + c[i]));
}
} else {
// 如果是字母
if (c[i] >= 'A' && c[i] <= 'Z') {
char temp = stack.peek().charAt(0);
if (temp >= '0' && temp <= '9') {
// 如果前面是数字直接加入栈
stack.add(c[i] + "");
}else {
String str = stack.peek();
stack.pop();
stack.add((str + c[i]));
}
}else
{
//只剩下一种情况']'
//取出字符串
String str=stack.peek();
stack.pop();
//取出数字
int number=Integer.parseInt(stack.peek());
stack.pop();
//弹出'['
stack.pop();
String temp="";
for(int j=0;j<number;j++)
temp+=str;
if(stack.isEmpty())
{
//如果栈为空直接加入sb
sb.append(temp);
}else
{
//如果栈不为空,分两种情况
//一种情况,前面是数字,直接加入temp
char tc = stack.peek().charAt(0);
if (tc >= '0' && tc <= '9') {
// 如果前面是数字直接加入栈
stack.add(temp);
}else {
String s = stack.peek();
stack.pop();
stack.add(s+temp);
}
}
}
}
}
}
}
System.out.println(sb);
}
}