栈相关笔试题

题目如下图:

在这里插入图片描述
解题代码如下:



    function smartRepeat (templateStr) {
      // 指针
      var index = 0
      // 栈1,存放数字
      var stack1 = []
      // 栈2,存放临时字符串
      var stack2 = []
      // 剩余部分
      var rest = templateStr

      while (index < templateStr.length - 1) {
        // 剩余部分
        rest = templateStr.substring(index)
        // console.log(rest)
        // 看当前剩余部分是不是以数字开头
        if (/^\d+\[/.test(rest)) {
          // 得到这个数字
          let times = Number(rest.match(/(^\d+)\[/)[1])
          // 指针后移,times 这个数字是多少位,就后移多少位加 1 位,
          // 为什么要加 1 ?加的1 位是为了跨过 [ 符号
          index += times.toString().length + 1
          // 把数字压栈,空字符串压栈
          stack1.push(times)
          stack2.push('')
        } else if (/^\w+\]/.test(rest)) {
          // 如果这个字符是字母,那么此时就把栈顶这项改为这个字母
          let word = rest.match(/^(\w+)\]/)[1]
          stack2[stack2.length - 1] = word
          // 让指针后移,word 这个词语是多少位就后移多少位
          index += word.length
        } else if (rest[0] === ']') {
          // 如果这个字符是 ] 那么就分三步做
          // ①将 stack1 弹栈 ② stack2 弹栈,③ 把字符串栈的最栈顶的元素重复刚刚弹出的那个字符串,对应的指定次数并拼接到新栈顶上
          let times = stack1.pop()
          let word = stack2.pop()
          // repeat 是 es6 的方法,比如 'a'.repeat(3) 得到 'aaa'
          stack2[stack2.length - 1] += word.repeat(times)
          index++
        }
        // console.log(index, stack1, stack2)
      }
      // while 结束之后, stack1 和 stack2 中肯定还剩余 1 项。返回栈2中剩下的这一项,重复栈1中剩下的这一项的次数,组中的这个字符串。
      // 如果剩的个数不对,那就是用户的问题,方括号没有闭合
      return stack2[0].repeat(stack1[0])
    }
    let newStr = smartRepeat('3[2[abc]2[d]]')
    console.log(newStr) // abcabcddabcabcddabcabcdd


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值