class Solution {
    int ptr = 0;
    // 栈
    // 对于数字、字符串和左括号将其压入栈中
    // 遇到右括号时,将相邻的左括号和字符串数字都弹出
    // 并将解码后的字符串在压入栈中
    // 定义一个全局变量用来遍历字符串
    // 使用了StringBuffer的insert方法 StringBuffer insert(int offset, String str)  在指定位置插入字符串
    public String decodeString(String s) {
        Stack<String> stack = new Stack<>();
        while (ptr < s.length()) {
            char c = s.charAt(ptr);
            if (Character.isDigit(c)) { //数字
                String digits = getDigits(s);
                stack.push(digits);
            } else if (Character.isLetter(c) || c == '[') { 
                stack.push(String.valueOf(c));
                ptr++;
            } else {   // 右括号
                StringBuffer sb = new StringBuffer();
                while (!stack.peek().equals("[")) {
                    sb.insert(0, stack.pop());
                }
                String str = sb.toString(); // 
                stack.pop(); // 删除左括号
                StringBuffer tmp = new StringBuffer(); 
                int repeat = Integer.parseInt(stack.pop());
                for (int j = 0; j < repeat; j++) {
                    tmp.append(str); 
                }
               stack.push(tmp.toString());
                ptr++;
            }
        }
        StringBuffer sb = new StringBuffer();
        while (!stack.isEmpty()) {
            sb.insert(0, stack.pop());
        }
        return sb.toString(); 
    }

    public String getDigits(String s) { // 获得数字
        StringBuffer sb = new StringBuffer();
        while (Character.isDigit(s.charAt(ptr)) && ptr < s.length()) {
            sb.append(s.charAt(ptr++));
        }
        return sb.toString();
    }



}