package leetcode;
import java.util.Stack;
public class demo_394 {
public String decodeString(String s) {
StringBuffer sb=new StringBuffer();
StringBuffer sb1;
StringBuffer sb2;
//存储字符串
Stack<StringBuffer> stack=new Stack<StringBuffer>();
//存储数字
Stack<Integer> num=new Stack<Integer>();
int i=0;
while(i<s.length()) {
sb1=new StringBuffer("");
sb2=new StringBuffer("");
if(s.charAt(i)=='[') {
stack.push(new StringBuffer().append('['));
i=i+1;
continue;
}
if(s.charAt(i)==']') {
//取出栈中数据
while(!stack.peek().toString().equals("[")) {
sb1.insert(0,stack.pop());
}
stack.pop();
//判断需要执行的次数
int nums=1;
if(!num.isEmpty()) {
nums=num.pop();
}
//再次放入栈中
for(int j=1;j<=nums;j++) {
sb2.append(sb1);
}
stack.push(sb2);
i=i+1;
continue;
}
//统计当前数字的大小
while(i<s.length()&&s.charAt(i)-'0'>=0&&s.charAt(i)-'0'<=9) {
sb1.append(s.charAt(i));
i++;
}
//将数字放入栈中
if(sb1.length()!=0) {
int n=Integer.valueOf(sb1.toString());
num.push(n);
continue;
}
//统计连续字符串
while(i<s.length()&&s.charAt(i)>='a'&&s.charAt(i)<='z') {
sb2.append(s.charAt(i));
i++;
}
//将字符串放入栈中
if(sb2.length()!=0) {
stack.push(sb2);
continue;
}
}
//从栈中取出数据,避免出现乱序,在头部插入
while(!stack.isEmpty()) {
sb.insert(0, stack.pop());
}
System.out.println(sb.toString());
return sb.toString();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
demo_394 demo=new demo_394();
demo.decodeString("100[leetcode]");
}
}