邂逅JavaScript数据结构与算法之栈

2.1 简介

数组是一个线性结构,并且可以在数组的任意位置插入和删除元素。而栈和队列就是比较常见的受限的线性结构(只能在一端添加和删除元素)。如下图所示

邂逅JavaScript数据结构与算法之栈_第1张图片

栈的特点为先进后出,后进先出(LIFO:last in first out)。

  • 其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底
  • 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之称为新的栈顶元素
  • 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素称为新的栈顶元素

2.2 栈常见的操作

  • push(element):添加一个新元素到栈顶位置;
  • pop():移除栈顶的元素,同时返回被移除的元素;
  • peek():返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它);
  • isEmpty():如果栈里没有任何元素就返回true,否则返回false;
  • size():返回栈里的元素个数。这个方法和数组的length属性类似;
  • toString():将栈结构的内容以字符串的形式返回

2.3 栈结构的实现

实现栈结构有两种比较常见的方式:

  • 基于数组实现
  • 基于链表实现
  <script>
    /** 类的所有方法都定义在类的prototype属性上面。
        在类的实例上面调用方法,其实就是调用原型上的方法
    */
    class Stack {
      constructor() {
        this.items = []
      }
      // 栈的相关操作:
      push(element) {
        this.items.push(element)
      }
      pop() {
        const removeItem = this.items.pop()
        return removeItem
      }
      peek() {
        return this.items[this.items.length - 1]
      }
      isEmpty() {
        return this.items.length === 0 ? true : false
      }
      size() {
        return this.items.length
      }
      toString() {
        return this.items.toString()
      }
    }
    const stack = new Stack()
  </script>

2.4 栈的应用(十进制转二进制)

如何实现十进制转为二进制?

  • 要把十进制转为二进制,可以将该十进制数字和2整除(二进制是满二进一),直到结果是0为止

  • 过程:

邂逅JavaScript数据结构与算法之栈_第2张图片

    // 函数:将十进制转为二进制
    function dec2bin(decNumber){
      // 1.定义栈对象
      const stack = new Stack();

      // 2.循环操作
      while(decNumber > 0){
        // 2.1 获取余数,并且放入栈中
        stack.push(decNumber % 2);

        // 2.2 获取整除后的结果,作为下一次运行的数字
        decNumber = Math.floor(decNumber / 2);
      }
      // 3.从栈中取出0或1
      let binaryString = '';
      while(!stack.isEmpty()){
        binaryString += stack.pop();
      }
      return binaryString;
    }
    alert(dec2bin(100))

想学习更多的可以去B站搜索coderwhy老师

你可能感兴趣的:(javascript)