目前我们用过的数据结构
- 数组:可以分为队列、栈等
- 哈希表:用来存储key-vaule
队列Queue
先进先出FIFO的数组
题目
- 请实现一个餐厅叫号网页
- 点击“取号”按钮生成一个号码
- 点击“叫号”按钮显示“请X号就餐”
代码
问
栈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
一个链一个

实际使用
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)