数据结构与算法

2019-10-25  本文已影响0人  niko_f697

概述

程序 = 数据结构 + 算法,数据结构和算法与语言无关,数据结构是管理和存储数据的方法,算法是解决问题的方法。

常用数据结构

1.数组

数组是一种很灵活的数据结构,可以从数组头部shift、unshift,也可以从数组尾部push、pop,从数组的任意位置插入元素array[index] = a,可以删除任意位置的元素,array.splice(index, 1) 并且操作过程中,数组会自动维护元素的索引以及自身的长度。比如下图,删除元素2,那么2后面的元素3、4、5会自动更新索引,数组的长度也会自动更新为4.(这也是为什么数组头部删除元素(unshift)比数组尾部删除元素(pop)性能要差不少的原因。unshift操作的开销更大)


数组.png

2.栈

栈相对于数组而言就是一种限制性比较强的数据结构。只能从栈顶入栈和出栈,并且要遵循后进先出(LIFO)的原则,如下图无法直接删除元素3,必须先删除元素4才能删除元素3.因为4比3先入栈,根据LIFO原则,4必须必3出栈。


栈.png

下面我们使用数组来实现一个简单的栈模型

class Stack {
  constructor () {
    this._items = []
  }
  // 入栈
  push (item) {
    this._items.push(item)
  }
  // 出栈
  pop () {
    return this._items.pop()
  }
  // 取栈顶元素
  peek () {
    return this._items[this._items.length - 1]
  }
  // 判断是否为空
  isEmpty () {
    return this._items.length === 0
  }
  // 得到栈的大小
  getSize () {
    return this._items.length
  }
}

然后我们利用这个栈模型做一个小小的实践,把10进制的数据转成2进制。原理就是除2取余把结果拼到一起然后倒序。比如把57转为2进制
57 / 2 = 28 余 1
28 / 2 = 19 余 0
19 / 2 = 9 余 1
9 / 2 = 4 余 1
4 / 2 = 2 余 0
2 / 2 = 1 余 0
1 / 2 = 0 余 1
结果拼起来1011001,倒序之后拿到最终结果为1001101,下面使用代码来实现

function decimalToBinary (decimal){
  let stack = new Stack()
  let str = ''
  while (decimal > 0) {
    let redecimal = decimal % 2
    stack.push(redecimal)
    decimal = Math.floor(decimal / 2)
  }
  while (!stack.isEmpty()) {
     str += stack.pop()
  }
  return str
}
// 调用
decimalToBinary(57) // 1001101

3.队列

队列跟栈的不同在于队列是元素从队尾入栈,从队首出栈。先入先出(FIFO)如下图


队列.png
                                   **未完待续**
上一篇下一篇

猜你喜欢

热点阅读