算法 -- 《利用栈来解题》
题目
解题思路
利用两个栈来将对应关系的值存储最后合并
[ 入栈, ] 出栈
如: 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))
人生很漫长,或许我只是你人生中微不足道的一小段,只是你人生中的惊鸿一瞥。