当前位置: 首页 > news >正文

线性数据结构-栈

在JavaScript中,栈(Stack)是一种遵循后进先出(Last In First Out, LIFO)原则的数据结构。这意味着最后进入栈的元素将会是第一个被移除的元素。栈通常被用于限制线性数据的访问顺序,使得数据的插入和删除操作只能在栈的一端进行。

栈的基本操作包括:

  • push:将一个元素放入栈顶。
  • pop:移除栈顶的元素,并返回被移除的元素。
  • peek 或 top:返回栈顶的元素,但不移除它。
  • isEmpty:检查栈是否为空。
  • size:返回栈中元素的数量。

数组实现栈:

  • 数组实现的栈在大多数情况下提供了更好的缓存性能,因为数组元素在内存中是连续存储的,这有助于利用现代处理器的缓存机制。
  • 数组的push和pop操作通常是高效的,时间复杂度为O(1)。
  • 但是,如果数组需要频繁地扩容(当数组满时),这将涉及到创建新数组并复制旧数组元素的操作,这个操作的时间复杂度为O(n)。不过,这种操作并不经常发生,因为数组扩容通常是成倍增长的,所以在多次push操作后才会触发。
class Stack {constructor() {this.items = []}push(value) {this.items.push(value)}pop() {return this.items.pop()}isEmpty(){return this.items.length === 0}peek() {if(this.isEmpty()){return undefined}return this.items[this.items.length - 1]}size() {return this.items.length}
}

链表实现栈

  • 链表实现的栈在动态内存分配方面更加灵活,因为链表节点可以分散在内存中,不需要连续的内存空间。
  • 链表的插入和删除操作(对应栈的push和pop)也是时间复杂度为O(1),但是因为这些操作需要处理指针,可能会有一些额外的开销。
  • 链表实现的栈不会遇到数组扩容的问题,因为链表可以根据需要动态地分配节点。
class Node {constructor(val) {this._value = val;this._next = null;}
}class Stack {constructor() {this._top = null;this._size = 0;}isEmpty() {return this._size === 0;}push(value) {const node = new Node(value)if (this.isEmpty()) {this._top = node} node.next = this._topthis._top = nodethis._size++}pop() {if (this.isEmpty()) {return undefined;}  this._size--const removedNode = this._topthis._top = this._top.nextreturn removedNode._value}peek() {if (this.isEmpty()) {return undefined}return this._top.value;}getSize() {return this._size;}
}

相关文章:

  • 【QEMU中文手册】2.2 调用方式(持续更新中)
  • Mimio安装
  • js实现简单计算器词法解析语法解析解释器,带可视化界面
  • 租用服务器提供服务
  • Docker 安装gitLab
  • web前端语言框架:探索现代前端开发的核心架构
  • Adobe Illustrator 基础学习
  • Java从放弃到继续放弃
  • Web前端商品详情:深入解析与技巧实践
  • 「前端+鸿蒙」鸿蒙应用开发-TS接口-特殊用途
  • LabVIEW进行负载测试
  • HALCON-从入门到入门-阈值分割定位算子综合运用
  • SD文生图超详参数使用技巧和方法-看这一篇就懂了!!!
  • 水质在线监测站:提高水质应急处理能力
  • AI办公自动化:用Kimi批量在Excel文件名中加入日期
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • CEF与代理
  • gf框架之分页模块(五) - 自定义分页
  • jquery ajax学习笔记
  • Phpstorm怎样批量删除空行?
  • Vultr 教程目录
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 机器学习中为什么要做归一化normalization
  • 基于Android乐音识别(2)
  • 利用DataURL技术在网页上显示图片
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 使用putty远程连接linux
  • 思否第一天
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • #stm32整理(一)flash读写
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (C++)八皇后问题
  • (笔记)M1使用hombrew安装qemu
  • (六)vue-router+UI组件库
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (学习总结)STM32CubeMX HAL库 学习笔记撰写心得
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .Net Core 中间件与过滤器
  • .Net FrameWork总结
  • .NET 中创建支持集合初始化器的类型
  • .Net多线程Threading相关详解
  • .Net中的设计模式——Factory Method模式
  • .net中生成excel后调整宽度
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /etc/sudoer文件配置简析
  • /proc/vmstat 详解
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • [\u4e00-\u9fa5] //匹配中文字符
  • [1204 寻找子串位置] 解题报告
  • [1525]字符统计2 (哈希)SDUT
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——