JS数据结构与算法知识点--->栈

此数据结构算法知识点系列笔记均是看coderwhy老师视频整理得出!!!

程序 = 数据结构 + 算法

数据结构的技术概念

数据结构就是在计算机中,存储和组织数据的方式

  1. 基于数组或者链表(后续会介绍)实现
  2. 数组是一种线性结构,并且可以在数组的任意位置插入和删除数据
  3. 栈和队列就是对这种任意性加以限制,是比较常见的受限的线性结构
  4. 后进先出(LIFO->last in first out)
  5. 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
  6. 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
程序中什么是使用栈实现的呢?

学了这么久的编程,是否听说过,函数调用栈呢?
我们知道函数之间和相互调用:A调用B,B中又调用C,C中又调用

  1. 那样在执行的过程中,会先将A压入栈,A没有执行完,所有不会弹出栈.
  2. 在A执行的过程中调用了B,会将B压入到栈,这个时候B在栈顶,A在栈底.
  3. 如果这个时候B可以执行完,那么B会弹出栈.但是B有执行完吗?没有,它调用了C.
  4. 所以C会压栈,并且在栈顶.而C调用了D,D会压入到栈顶.
  5. 所以当前的栈顺序是:栈顶A->B->C->D栈顶
  6. 执行完,弹出栈.C/B/A依次弹出栈.
  7. 所以我们有函数调用栈的称呼,就来自于它们内部的实现机制.(通过栈来实现的)
    在这里插入图片描述
面试题目

有六个元素6,5,4,3,2,1的顺序进栈,下列哪个出栈顺序不正确?
A. 5 4 3 6 1 2
B. 4 5 3 2 1 6
C. 3 4 6 5 2 1
D. 2 3 4 1 5 6
根据栈特点,必须要严格执行先进后出,进栈顺序也一定是6 5 4 3 2 1
拿A来举例 从选项入手,
在这里插入图片描述
第一个出栈的是5是先出栈,那么必定 是6,5被依次先进栈,然后5出栈,栈里剩6
然后是4出栈,说明5出栈之后,4进栈,并出栈,栈里剩下6
然后是3出栈,说明4出栈之后,3进栈并出栈,栈里剩下6
然后是6出栈,栈里没有东西了
然后是1出栈,说明2,1是依次进栈的,然后1,2依次出栈

栈常见的有哪些操作
  • push():添加一个新元素到栈顶
  • pop():移除栈顶元素,并返回被移除的元素
  • peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅是返回它)
  • isEmpty():如果栈里无任何元素就返回 true,否则返回false
  • size():返回个数,和length类似
  • toString():
    <script>
      // 封装栈类
      function Stack() {
        this.items = [];
        //1.push
        // this.push = function () {};
        Stack.prototype.push = function (ele) {
          this.items.push(ele);
        };
        // 2.pop
        Stack.prototype.pop = function () {
          return this.items.pop();
        };
        // 3.peek
        Stack.prototype.peek = function () {
          return this.items[this.items.length - 1];
        };
        //4.isEmpty
        Stack.prototype.isEmpty = function () {
          return this.items.length === 0;
        };
        //5.size
        Stack.prototype.size = function () {
          return this.items.length;
        };
        //6.toString
        Stack.prototype.toString = function () {
          // 将数组内容以逗号隔开,并组成字符串
          return this.items.join(",");
        };
      }
      // 栈的使用
      var useStack = new Stack();
      useStack.push(1);
      useStack.push(2);
      console.log(useStack.items); //[1, 2]
      useStack.pop();
      console.log(useStack.items); //[1]
	  useStack.peek();
	  console.log(useStack.items); //[1]
	  ...
    </script>
实现一个十进制转换为2进制的函数

基于上面封装的栈类实现

      function to2(num) {
        // 定义对象
        var stack = new Stack();
        // 循环操作
        while (num > 0) {
          // 获取余数,压栈
          stack.push(num % 2);
          // 获取整数后的结果,做为下一次执行的初始值
          num = Math.floor(num / 2);
        }
        // 从栈中取出 0 1
        var binaryString = "";
        while (!stack.isEmpty()) {
          binaryString += stack.pop();
        }
        return binaryString;
      }
	  console.log(to2(100)); //1100100
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoZai_ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值