JavaScript栈和队列

数组是一个线性结构,并且可以在数组的任意位置插入和删除元素。

栈和队列就是比较常见的受限的线性结构

一、栈结构(Stack)

1.1、栈介绍

是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。

**栈的特点是:**先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。

栈的受限性体现在只允许在栈顶插入和删除,因此出栈和入栈都是在栈顶

image.png

1.2、程序中的栈结构:

**函数调用栈:**A(B(C(D()))):即A函数中调用B,B调用C,C调用D;在A执行的过程中会将A压入栈,随后B执行时B也被压入栈,函数C和D执行时也会被压入栈。所以当前栈的顺序为:A->B->C->D(栈顶);函数D执行完之后,会弹出栈被释放,弹出栈的顺序为D->C->B->A;

递归:为什么没有停止条件的递归会造成栈溢出?比如函数A为递归函数,不断地调用自己(因为函数还没有执行完,不会把函数弹出栈),不停地把相同的函数A压入栈,最后造成栈溢出(Stack Overfloat)

image.png

1.3、栈常见的操作:

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

1.4、在 JavaScript 中实现栈操作

  • JavaScript 有一个很棒的内置堆栈(和队列)实现:Array类型。
  • 每个 JavaScript 数组都有push()和pop()函数。
  • 如果您想在生产代码中使用堆栈(或队列),只需使用常规 JavaScript 数组即可。
  • push(data)将数据添加到栈顶。
  • pop()删除并返回最近添加的数据。

二、队列结构(Queue)

队列是是一种受限的线性表,特点为先进先出(FIFO:first in first out)。

受限之处在于它只允许在表的前端(front)进行删除操作;
在表的后端(rear)进行插入操作;

image.png

相当于排队买票,先来的先买票,后来的后买票。

image.png

2.1、队列的应用:

  • **打印队列:**计算机打印多个文件的时候,需要排队打印;
  • **线程队列:**当开启多线程时,当新开启的线程所需的资源不足时就先放入线程队列,等待CPU处理;

2.2、队列的常见操作:

  • enqueue(element):向队列尾部添加一个(或多个)新的项;
  • dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素;
  • front():返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息与Stack类的peek方法非常类似);
  • isEmpty():如果队列中不包含任何元素,返回true,否则返回false;
  • size():返回队列包含的元素个数,与数组的length属性类似;
  • toString():将队列中的内容,转成字符串形式;

2.3、在 JavaScript 中实现队列操作

与内置的 Stack 实现类似,队列也可以通过一些 JavaScript 方法使用。`JavaScript 提供了两种方法,shift和push.

push()方法视为将提供的数据添加到数组末尾的入队操作。

const nums = [5, 8, 1, 4];
nums.push(2, 3);
console.log(nums); //[5, 8, 1, 4, 2, 3 ]

出队操作使用shift(),删除数组首位数据并返回

const nums = [5, 8, 1, 4];
const num = nums.shift();
console.log(num); // 5
console.log(nums); // [8, 1, 4]

拓展–push和unshift谁高

unshift表头添加—牵一发动全身,它每添加一个元素,都要把现有元素往下移一个位置。但到底效率差异有多大呢?

unshift 比 push 要慢差不多 100 倍!

因此,平时还是要慎用 unshift,特别是对大数组。那如果一定要达到 unshift 的效果,有没有其他方法呢?

Array 有一个叫做 reverse 的方法,能够把一个数组反转。先执行一次 reverse ,再把要放进数组的元素用 push 添加,再执行一次 reverse,就达到了 unshift 的效果。

const arr = [0,1,2]
arr.reverse()
arr.push(3)
arr.reverse()
console.log(arr) //  [3, 0, 1, 2]
  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值