队列、栈、链表、哈希表、树

117 阅读2分钟

目前我们用过的数据结构

  • 数组:可以分为队列、栈等
  • 哈希表:用来存储key-vaule

队列Queue

先进先出FIFO的数组

题目

  • 请实现一个餐厅叫号网页
  • 点击“取号”按钮生成一个号码
  • 点击“叫号”按钮显示“请X号就餐”

代码

  • 首先选择队列queue作为数据结构
  • queue.push为入队、queue.shift为出队
  • 记得练习一下call的用法
  • 其他的事情就顺其自然了
  • 完整代码codesandbox.io/s/naughty-f…

  • 如果不知道队列你会怎么做

栈Stack

后进先出LIFO的数组

举例

  • JS函数的调用栈call stack就是一个栈
  • 假设f1调用了f2,f2又调用了f3
  • 那么f3结束后应该回到f2,f2结束后应该回到f1

代码

function f1(){let a = 1; return a+f2()}
function f2(){let b = 2; return b+f3()}
function f3(){let c = 3;return c}
f1()
  • 画一下压栈、出栈过程便知这是“后入先出”的栈

留一个悬念

  • 内存图里的栈内存和这个调用栈是什么关系
  • 关系很大
  • 是同一块内存吗?有很大重叠

链表Linked List

一个链一个

1.jpg

实际使用

let array = [1,2,3]
array._proto_ === Array.prototype
Array.prototype._proto_ === Object.prototype
  • 从这个角度看对象,就是链表

代码

  • list = create(value)
  • node = get(index)
  • append(node,value)
  • remove(node)
  • travel(list,fn)

链表的变形

  • 双向链表:每个节点有一个previous指向上一个节点
  • 循环链表:最后一个节点的next指向头节点

哈希表

key-value pairs

一篇介绍文章

www.zhihu.com/question/33…

哈希表的难点

场景

  • 假设哈希表里有一万对key-vaule
  • 比如name:'frank',age:18,p1:'property1'...
  • 如何使得读取hash['xxx']速度最快

解决办法

  • 不做任何优化,hash['xxx']需要遍历所有key,O(n)
  • 对key排序,使用二分查找,O(log2 n)
  • 用字符串对应的ASCII数字做索引,O(1)
  • 对索引做除法取余数,O(1)
  • 冲突了怎么办,冲突了就顺延

树Tree

一个链多个

实际使用

  • 中国的省市区,看成一棵树
  • 公司的层级结构,tree
  • 网页中的节点,tree

代码

  • let tree = creatTree(value)
  • let node = creatNode(value)
  • addChild(tree,node)
  • removeChild(node1,node2)
  • travel(tree)