算法 -- 《利用栈来解题》

题目

image

解题思路

利用两个栈来将对应关系的值存储最后合并
[ 入栈, ] 出栈
如: 3[2[a]2[b]], 先将3入栈1,栈2入“”(占位) stack1 = [3] stack2 = [""]
接下来 2入栈1, 栈2"" stack1 = [3, 2] stack2 = ['', '']
遇到] 栈12都出栈 stack2的最后一个元素为, 刚出栈元素处理集合 stack1 = [3] stack2 = [aa]
接下来 2入栈1, 栈2"" stack1 = [3, 2] stack2 = [aa, '']
遇到] 栈12都出栈 stack2的最后一个元素为, 刚出栈元素和之前值处理的集合 stack1 = [3] stack2 = [aabb]
遇到] 栈12都出栈 处理的 aabbaabbaabb

代码解析示例

var str = '2[1[a]3[b]2[3[c]]]';

   function handle(str) {
     let stack1 = [], stack2 = [], index = 0, rest = str, res = ''

     while(index < str.length ) {
       rest = str.substring(index)

       if(/^(\d+)\[/.test(rest)) { // 入栈
         stack1.push(RegExp.$1)
         stack2.push('')
         index += RegExp.$1.length
         // rest = str.substring(index + 1) // 跳过[
         index++
       } else if(/^(\d+|\w+)+]/.test(rest)) { // 出栈
         stack2.pop()
         let num = +stack1.pop()
         stack2[stack2.length - 1] += RegExp.$1.repeat(num)
         index += RegExp.$1.length + 1
         // rest = str.substring(index)
       } else if(/^\]/.test(rest)){ // 最后一栈输出结果
         let num = +stack1.pop(),
             strackStr = stack2.pop()
         if(stack2.length == 0)  {
           res = strackStr.repeat(+num)
         } else {
           stack2[stack2.length - 1] += strackStr.repeat(+num)
         }
         index++
       } else{ index++ }
     }
     
     return res
   }

   console.log(handle(str))
posted on 2023-03-01 21:58  京鸿一瞥  阅读(14)  评论(0编辑  收藏  举报