当前位置:   article > 正文

栈数据结构_什么导致了栈结构后进先出的特点

什么导致了栈结构后进先出的特点

1: 栈数据结构:

  1. 1: 栈 (stack) 又名堆栈, 它是一种运算受限的线性表, 仅在表尾进行插入和删除操作,
  2. 这一端叫做栈顶, 另一端叫做栈底。
  3. 2: 向栈中插入新元素叫做进栈, 入栈, 或者压栈; 从栈中删除一个元素又叫做出栈或者退栈。
  4. 3: 后进先出的特点: 栈中元素, 最先进展的必定最后出栈, 后进栈的一定会出栈。栈结构特点: 就是先进后出的特点。
  5. 所有的插入元素, 删除操作只可以在一端进行。 这一端就是栈顶。
  6. 4:javascript 中, 栈可可以使用数组模拟, 只需要限制使用push() 和 pop(), 不能使用
  7. unshift() 和 shift() 方法;
  8. 利用 "栈"
  9. 遍历每一个字符:
  10. 1: 遍历这个字符的数字, 那么就把数字压栈, 把字符串压栈
  11. 2; 如果在这个字符是字母, 那么此时就是把栈顶这项改为字母。
  12. 3: 如果这个字母是 ] 就是将数字弹栈, 就是把字符串栈的栈顶的元素重复刚刚的这个次数, 然后弹栈, 拼接到新的栈顶上。

vue-loader 底层是以字符串的视角解析html 模板的。

  1. var tempalteString = `
  2. <div>
  3. <h3></h3>
  4. <ul>
  5. <li>A</li>
  6. <li>B</li>
  7. <li>C</li>
  8. </ul>
  9. </div>
  10. `;
  11. const AST = parse(templateString);
  12. // 定义parse 函数:
  13. export default function (templateString) {
  14. return templateString;
  15. // 指针
  16. var index = 0;
  17. // 剩余部分
  18. var rest = '',
  19. // 开始标记
  20. var startRegExp = /^\<([a-z]+[1-6]?)\>/;
  21. // 结束标记
  22. var endRegExp = /^\<\/([a-z]+[1-6]?)\>/;
  23. while(index < templateString - 1) {
  24. test = templateString.substring(index);
  25. // 识别遍历到这个字符, 是不是开始标签
  26. if(startRegExp.test(test)) {
  27. let tag = templateString.match(startRegExp)[1];
  28. console.log('检测到开始标记', tag);
  29. // 指针移动标签的长度加2, 为什么要加上2呢? 因为<> 需要占两位。
  30. index += tag.length + 2;
  31. }else if(endRegExp.test(test)){
  32. // 识别遍历到这个字符, 是不是一个结束标签
  33. let tag = rest.match(endRegExp, tag);
  34. // 指针移动标签的长度加3, 为什么要加上2呢? 因为</> 也占3 位
  35. index += tag.length + 3;
  36. }else {
  37. // 标签内容
  38. index ++;
  39. }
  40. }
  41. }
  42. 还有一种自封闭标签是比较麻烦的。
  43. AST 抽象语法树的算法就是用到的是指针思想, 加上栈的算法。

vue  会字符串的视角审视所有的书写的html 结构。

  1. 在 vue底层中会把所有的htm 模板中的数据全部遍历一遍。
  2. 用js 对象模拟抽象语法树
  3. {
  4. tag: "div", // 标签
  5. attrs: [{name: "class", value: "title"}], // 书香
  6. type: 1,
  7. children: [
  8. {
  9. tag: "h3",
  10. attrs: [{name: "class", value: "title"}]
  11. type: 1,
  12. children: [{text: "我是一个标题", type: 3}]
  13. },
  14. {
  15. tag: "ul",
  16. attrs: [],
  17. type: 1,
  18. children: [
  19. {
  20. tag: "li",
  21. for: "arr",
  22. key: "index",
  23. alis: "item",
  24. type: 1,
  25. children: []
  26. }
  27. ]
  28. }
  29. ]
  30. }
  31. 编译原理: 都需要使用ast 抽象语法树。
  32. 抽象语法树与虚拟节点的关系:
  33. 抽象语法树并不需要进行虚拟节点的比较。 但是虚拟节点需要进行diff 算法的比较才可以生成ui界面。
  34. 抽象语法树需要生成渲染函数, 再到虚拟节点
  35. vue 中模板语法 ==> AST 语法树 ==> 然后渲染函数(h 函数) ==>VDOM ===> 在ui 界面

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/641316
推荐阅读
相关标签
  

闽ICP备14008679号