编辑代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  // 读取输入的字符串,例如:"3[m2[c]]"
  const str = await readline();

  // 用于存储重复次数的栈,例如:[3, 2]
  let numStack = [];
  // 用于存储字符的栈,例如:['m', 'c']
  let strStack = [];
  // 用于临时存储数字字符的数组,例如:['3', '2']
  let repeatNumStack = [];
  // 用于记录字符串栈中需要重复的起始位置
  let idxStack = [];

  // 遍历输入字符串的每个字符
  for (const c of str) {
    if (c == "[") {
      // 遇到左方括号时:
      // 1. 将之前收集的数字字符转换为数字
      // 2. 将数字压入数字栈
      // 3. 清空临时数字数组
      // 4. 记录当前字符串栈的长度,作为需要重复的字符串的起始位置
      const num = Number(repeatNumStack.join(""));
      numStack.push(num);
      repeatNumStack = [];
      idxStack.push(strStack.length);
    } else if (c == "]") {
      // 遇到右方括号时:
      // 1. 弹出数字栈顶的数字作为重复次数
      // 2. 弹出索引栈顶的位置作为起始位置
      // 3. 从起始位置截取字符串栈中的所有字符
      // 4. 将截取的字符串重复指定次数后压回字符串栈
      const repeatNum = numStack.pop();
      const idx = idxStack.pop();
      const str = strStack.splice(idx).join("");
      strStack.push(str.repeat(repeatNum));
    } else if (c >= "0" && c <= "9") {
      // 如果是数字字符,加入临时数字数组
      repeatNumStack.push(c);
    } else {
      // 如果是字母,直接加入字符串栈
      strStack.push(c);
    }
  }

  // 最后将字符串栈中的所有字符连接并输出
  console.log(strStack.join(""));
})();
// 3[m2[c]]