使用JavaScript学习数据结构和算法(1) | 小册免费学

579 阅读3分钟

系列文章

栈(Stack) 是一种遵循 先进后出(LIFO) 的原则的有序集合。 新添加的或待删除的元素都保存在站的末尾,称为栈顶,另一端就叫栈底。 在栈里,新元素都靠近栈顶,旧元素都接近栈底。

比如:一摞书、或者餐厅里的盘子。

Stack.png

// 栈 先入后出
class Stack{
        constructor(){
          this.items = []
        }
        push(item){
           this.items.push(item)
        }
        pop(){
          return this.items.pop()
        }
        size(){
          return this.items.length
        }
        clear(){
          this.items = []
        }
}
let stack = new Stack()
stack.push(1)// 入栈
stack.push(2)// 入栈
stack.push(3)// 入栈
stack.push(4)// 入栈
stack.push(5)// 入栈
console.log(stack.size());// 5
console.log(stack.pop());// 出栈
console.log(stack); //[1,2,3,4]
console.log(stack.size());// 4

队列

队列(Queue) 是一种遵循 后进先出(FIFO) 原则的有序的项。 队列在尾部添加新元素,并从顶部移除元素,最新添加的元素必须排在队列的尾部。

比如:餐厅里的排队取餐。

Queue.png

  • 优先队列 设置优先级,然后在正确的位置添加元素
  • 循环队列 每次执行都把队列的第一个元素移除,放置尾部。

链表

链表(LinkedList) 储存有序的元素集合,每个元素都有一个储蓄元素本身的节点和一个指向下一个元素的引用(也称为指针或者链接)组成。

比如:寻宝游戏或者火车的一系列车厢。

LinkedlList.png

例子:

// {element: 'A', next:{element: 'B', next:{..}}}
(A) => (B) => C;
// 在 A 和 B 之间插入 E
(A) => (E) => (B) => C;
// 删除 E
(A) => (B) => C;
  • 添加元素
    1. 把 A 的 next 指向 E
    2. 把 E 的 next 指向 B
  • 删除元素
    1. 把 A 的 next 指向 B
    2. 把 B 的 next 指向 C

双向链表

链表是双向的,一个元素链向下一个元素同时也链向上一个元素。

double_list.png

循环链表

每个元素不仅链向下一个元素和上一个元素,而且头部和尾部的元素也相连,形成一个闭环。

head.prev = tail.next;

circular_list.png

图片来源:

集合

集合是由一组无序且唯一(即不能重复)的项组成的。这个数据结构使用了有限集合相同的数学概念,在数学中,集合是一组不同的对象(的集) 你可以把集合想象成一组没有重复元素,也没有顺序的数组(其实在 JS 中就是对象,ES6 中的 Set 数据结构就是是集合的实现,它类似数组,但是成员都是唯一的。 )。 集合的一些操作:

  • 并集:对于给定两个集合,返回一个包含两个集合中所有元素的新集合。
  • 交集:对于给定两个集合,返回一个包含两个集合中共有元素的新集合
  • 差集:对于给定两个集合,返回一个所有存在于第一个集合且不存在与第二个集合的元素的新集合
  • 子集:对于给定两个集合,验证一个集合,是否是另一个元素的子集。

来自九旬的原创:博客原文链接

本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情