洛谷P1928 外星密码(java)

题目描述 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);
	}
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值