栈数据

2022/9/10 javascript数据结构与算法

# 什么是栈

栈是一种数据呈线性排列的数据结构,不过在这种结构中,我们只能访问最新添加的数据。

栈就像是一摞书(📚),拿到新书时我们会把它放到书堆的最上面,取书时也只能从最上面的新书开始取。

像栈这种最后添加的数据最先被取出,即 “后进先出” 的结构,我们称之为 Last in First Out (LIFO)

和队列刚好相反,队列数据结构就像排队一样,先排先出 First in First Out (FIFO)。

# smartRepeat

function smartRepeat(templateStr) {
  const stackNumber = [];
  const stackWord = [];
  let rest = templateStr;
  let index = 0;
  while (index < templateStr.length - 1) {
    rest = templateStr.substring(index);
    // 先把数字放入数字栈中
    if (/^\d+\[/.test(rest)) {
      // 拿到数字
      const times = Number(rest.match(/^(\d+)\[/)[1]);
      // 数字压栈
      stackNumber.push(times);
      // 字符栈要压一个空字符串
      stackWord.push("");
      // 指针后移:加1是[
      index += times.toString().length + 1;
    } else if (/^\w+\]/.test(rest)) {
      // 拿到文本字符,把文字栈的栈顶压入这个文本(也就是和之前的栈顶的文字拼接)
      const word = rest.match(/^(\w+)\]/)[1];
      stackWord[stackWord.length - 1] = word;
      // 指针后移 word 长度位数
      index += word.length;
    } else if (rest[0] === "]") {
      // 如果是 ] 就表示遇到结束符号,当前数字栈和文字栈需要将栈顶弹出了
      // 将弹出的文字重复弹出的数字的次数,在将已经重复过的文字拼接到栈顶
      const repeatCount = stackNumber.pop();
      const outWord = stackWord.pop();
      // repeat 是es6的方法,表示字符串要重复次数
      const newWord = outWord.repeat(repeatCount);
      stackWord[stackWord.length - 1] += newWord;
      index++;
    }
  }
  return stackWord[0].repeat(stackNumber[0]);
}

const templateStr = "2[3[abc]4[d]5[6e]]";
const result = smartRepeat(templateStr);
console.log(result);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Last Updated: 2022/9/18 下午9:15:31