文章目录
数组是一个线性结构,并且可以在数组的任意位置插入和删除元素。
而栈和队列就是比较常见的受限的线性结构。
一、栈结构(Stack)
1.1、栈介绍
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。
**栈的特点是:**先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。
栈的受限性体现在只允许在栈顶插入和删除,因此出栈和入栈都是在栈顶
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)
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)进行插入操作;
相当于排队买票,先来的先买票,后来的后买票。
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]