栈和队列在数组中的应用

前言

ECMAScript 中的 Array 实例,提供了一些方法,来实现一些数据结构。比如栈和队列。

例子

栈的实现

栈是一种后进先出(LIFO,Last-In-First-Out)的数据结构,可以理解为堆叠在一起的扑克牌。我们要知道,只在一端操作栈,那就是栈顶。数组中的 push(推入)和 pop(弹出)这两个方法可以实现这种结构(当然,可以用 unshiftshift 实现反向的栈)。数组中的这两个方法都是在数组尾部执行的,push在数组末尾添加元素(可多个),并返回数组长度,pop在数组末尾删除一个元素,并返回删除的元素,看下面代码:

JavaScript 复制代码
let stackArray = [];

// push 入栈
let count = stackArray.push('a', 'b', 'c');
console.log(count); // 3

// pop 出栈
let deleteItem = stackArray.pop();
// 最后添加的元素先出
console.log(deleteItem); // c

console.log(stackArray); // [ 'a', 'b' ]

队列的实现

队列是一种先进先出(FIFO,First-In-First-Out)的数据结构,可以理解为排队。我们要知道,队列的实现只在两端,一端进,一端出。数组中的 shiftpush,可以把数组当成队列来使用。shift在数组头部删除一个元素,并返回删除的元素,push在数组末尾添加元素(可多个),并返回数组长度,看下面代码:

JavaScript 复制代码
let stackArray = [];

// push
let count = stackArray.push('a', 'b', 'c');
console.log(count); // 3

// shift
let deleteItem = stackArray.shift();
// 最先添加的元素先出
console.log(deleteItem); // a 

console.log(stackArray); // [ 'b', 'c' ]

当然也可以用unshiftpop实现反向的队列。unshift在数组头部添加元素(可多个),并返回数组长度,pop在数组末尾删除一个元素,并返回删除的元素,看下面代码:

JavaScript 复制代码
let stackArray = [];

// unshift
let count = stackArray.unshift('a', 'b', 'c');
count = stackArray.unshift('d');
console.log(count); // 4
console.log(stackArray); // [ 'd', 'a', 'b', 'c' ]

// pop
let deleteItem = stackArray.pop();
// 最先添加的元素先出
console.log(deleteItem); // c 

console.log(stackArray); // [ 'd', 'a', 'b' ]

总结

在数组中实现栈和队列,需要结合数组的特性来处理,下面是我自己理解的一些点:

  • 用代码实现这两种数据结构时,顺序都要满足 In-Out,也就是先添加,然后再移除。
  • 添加的操作:push、unshift
  • 移除的操作:pop、shift

对于栈

  • 栈是在一端操作的,即栈顶。
  • 数组从左往右看,数组末尾相当于是栈顶,pushpop 都是在末尾操作数组的,可以实现栈;同理,实现反向的栈,只要在数组头部操作即可(unshiftshift);

对于队列

  • 队列是在两端操作的,即头和尾。
  • 数组从左往右看,同时联想排队的场景,数组头部(左)就是队伍的头部,数组尾部(右)就是队伍的尾部。使用 push 在尾部添加元素,shift 在头部删除元素即可实现一个队列。同理,实现反向的队列,只要在头部添加元素,尾部出元素即可(unshiftpop)。

(结束)最后,假如有疑问的地方,欢迎👏🏻评论区讨论!

相关推荐
小桥风满袖14 分钟前
极简三分钟ES6 - ES8中字符串扩展
前端·javascript
张拭心15 分钟前
这就是流量的力量吗?用豆包 AI 编程做的xhs小组件帖子爆了
前端·ai编程·豆包marscode
少年阿闯~~18 分钟前
CSS3的新特性
前端·javascript·css3
IT_陈寒24 分钟前
React性能优化:这5个Hook技巧让我的组件渲染效率提升50%(附代码对比)
前端·人工智能·后端
智能化咨询40 分钟前
【Linux】【实战向】Linux 进程替换避坑指南:从理解 bash 阻塞等待,到亲手实现能执行 ls/cd 的 Shell
前端·chrome
Anson Jiang43 分钟前
浏览器标签页管理:使用chrome.tabs API实现新建、切换、抓取内容——Chrome插件开发从入门到精通系列教程06
开发语言·前端·javascript·chrome·ecmascript·chrome devtools·chrome插件
掘金安东尼1 小时前
黑客劫持:周下载量超20+亿的NPM包被攻击
前端·javascript·面试
剑亦未配妥2 小时前
移动端触摸事件与鼠标事件的触发机制详解
前端·javascript
人工智能训练师8 小时前
Ubuntu22.04如何安装新版本的Node.js和npm
linux·运维·前端·人工智能·ubuntu·npm·node.js