JavaScript 中实现常见数据结构:栈、队列与树

文章目录

  • JavaScript 中实现常见数据结构:栈、队列与树
    • 引言
      • 一、栈(Stack)
      • 二、队列(Queue)
      • 三、树(Tree)
      • 结语与祝福代码

JavaScript 中实现常见数据结构:栈、队列与树

引言

在前端开发中,理解和掌握基础数据结构是提升代码质量、优化算法性能和解决复杂问题的关键。本文将通过JavaScript语言,深入浅出地介绍三种常用的数据结构——栈(Stack)、队列(Queue)和树(Tree),并辅以实例代码帮助读者更好地理解和运用它们。

一、栈(Stack)

栈是一种遵循"后进先出"(Last In First Out, LIFO)原则的线性数据结构。在JavaScript中,我们可以使用数组或类来模拟栈的行为。

用一个序列图(sequence diagram)来表示其“后进先出”(LIFO)的操作过程。入栈(push)、查看栈顶元素(peek)和出栈(pop)操作。

User Stack push(3) (3 added) push(2) (2 added) push(1) (1 added) peek() (returns 1, stack unchanged) pop() (returns 1) (stack now [2, 3]) pop() (returns 2) (stack now [3]) isEmpty() (returns false) pop() (returns 3) (stack now empty) (isEmpty() returns true) User Stack

下面是一个简单的例子:

class Stack {constructor() {this.items = [];}// 入栈push(element) {this.items.push(element);}// 出栈pop() {if (this.isEmpty()) {return 'Stack is empty';}return this.items.pop();}// 查看栈顶元素peek() {return this.items[this.items.length - 1];}// 判断栈是否为空isEmpty() {return this.items.length === 0;}// 获取栈的大小size() {return this.items.length;}
}// 示例用法:
const myStack = new Stack();
myStack.push(1);
myStack.push(2);
console.log(myStack.pop()); // 输出: 2

栈作为一种“后进先出”(Last In First Out, LIFO)的数据结构,其操作主要包含两个核心方法:push用于将元素添加到栈顶,pop用于从栈顶移除并返回最后一个添加的元素。在JavaScript中,我们可以利用数组的内置方法来方便地模拟栈的行为,或者创建一个自定义类以更好地体现栈的逻辑和功能。

使用JavaScript数组模拟栈

由于JavaScript数组提供了pushpop方法,它们恰好符合栈的操作要求,因此可以直接用数组实现栈的功能:

// 使用数组模拟栈
let stack = [];// 入栈操作
stack.push(1);
stack.push(2);
stack.push(3);console.log(stack); // 输出: [1, 2, 3]// 出栈操作
let topElement = stack.pop(); // 从栈顶弹出元素,并赋值给topElement
console.log(topElement); // 输出: 3
console.log(stack); // 输出: [1, 2]

创建自定义栈类

尽管可以简单地使用数组,但为了更清晰地表示栈的语义以及便于扩展功能,我们通常会创建一个自定义栈类:

class Stack {constructor() {this.items = []; // 内部使用数组存储栈中的元素}// 入栈方法push(element) {this.items.push(element);}// 出栈方法pop() {if (this.isEmpty()) {throw new Error('Stack is empty');}return this.items.pop();}// 查看栈顶元素,不改变栈状态peek() {if (this.isEmpty()) {throw new Error('Stack is empty');}return this.items[this.items.length - 1];}// 判断栈是否为空isEmpty() {return this.items.length === 0;}// 获取栈的大小size() {return this.items.length;}
}// 示例用法:
const myStack = new Stack();
myStack.push('First');
myStack.push('Second');
console.log(myStack.peek()); // 输出: 'Second'
console.log(myStack.pop()); // 输出: 'Second'
console.log(myStack.isEmpty()); // 输出: false

通过这样的自定义栈类,我们不仅能够直观地进行栈操作,还可以增加额外的方法如peek来查看栈顶元素而无需真正移除它,从而满足更多复杂场景的需求。

二、队列(Queue)

队列遵循“先进先出”(First In First Out, FIFO)原则。同样,我们也可以利用数组或者类实现队列功能。

class Queue {constructor() {this.items = [];}// 入队enqueue(element) {this.items.push(element);}// 出队dequeue() {if (this.isEmpty()) {return 'Queue is empty';}return this.items.shift();}// 查看队首元素front() {return this.items[0];}// 判断队列是否为空isEmpty() {return this.items.length === 0;}// 获取队列大小size() {return this.items.length;}
}// 示例用法:
const myQueue = new Queue();
myQueue.enqueue('Front');
myQueue.enqueue('Middle');
console.log(myQueue.dequeue()); // 输出: 'Front'

三、树(Tree)

树是一种非线性的数据结构,它由节点(Node)和边组成,每个节点可以有零个或多个子节点。在JavaScript中,我们可以创建一个表示节点的类,并通过引用的方式构建层级关系。

class Node {constructor(data) {this.data = data;this.children = [];}addChild(childNode) {this.children.push(childNode);}
}class Tree {constructor(root) {this.root = new Node(root);}traverseDFS(node = this.root, callback) { // 深度优先遍历示例callback(node);for (let child of node.children) {this.traverseDFS(child, callback);}}traverseBFS() { // 广度优先遍历示例,使用队列let queue = [this.root];while(queue.length > 0) {let current = queue.shift();console.log(current.data); // 打印节点值queue = [...queue, ...current.children];}}
}// 示例用法:
const tree = new Tree('Root');
const child1 = new Node('Child1');
const child2 = new Node('Child2');
tree.root.addChild(child1);
tree.root.addChild(child2);
tree.traverseDFS(); // 深度优先遍历
tree.traverseBFS(); // 广度优先遍历

结语与祝福代码

理解并掌握这些基础数据结构就像是拥有了强大的工具箱,使我们在前端编程世界中游刃有余。让我们一起成长,就如同栈中的元素不断积累,如同队列中的任务逐个完成,如同树般枝繁叶茂,向着技术的高峰攀登!

下面是一个结合栈和字符串的小彩蛋,生成一句祝福:

class ReverseWordsInSentence {reverseWords(sentence) {const stack = new Stack();sentence.split(' ').forEach(word => stack.push(word));let reversedSentence = '';while (!stack.isEmpty()) {reversedSentence += stack.pop() + ' ';}return reversedSentence.trim();}
}const revWords = new ReverseWordsInSentence();
console.log(revWords.reverseWords("Happy learning, fellow developers!")); 
// 输出:"developers! fellow learning, Happy"

愿每位开发者都能在学习过程中收获满满的快乐!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/690446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【已解决】引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。

这种问题产生一般都会手足无措,包括笔者,但是不要慌,这种问题一般都是内存泄漏引起的。例如读者要访问一个已经被析构或者释放的变量,当然访问不了,导致存在问题。这时候读者应该从哪里产生内存泄漏这方面进行考虑&…

【VSCode】设置 一键生成vue模板 的快捷入口

问题 每次写一个组件的时候,都需要去手敲默认结构或者是复制粘贴,十分的麻烦! 解决办法 文件 > 首选项 > 用户代码片段 > vue.json 配置vue模板 其中prefix是用来触发代码段的内容,即模版的快捷入口;body里…

【SpringBoot2】Spring容器的本质就是两个HashMap

做为Java程序员,我们就是Spring的用户,Spring的影子在我们的代码里几乎是无处不在,那Spring到底是什么,带给我们什么,如何工作的呢?这个简单问题貌似又不太好讲。例如如果要问一下什么是Spring框架, 可以找到大量的解答,基本内容如下: Spring是一个开源的应用程序框架…

【Funny Game】 吃豆人

目录 【Funny Game】 吃豆人 吃豆人 文章所属专区 Funny Game 吃豆人 吃豆人,这款经典游戏如今依旧魅力四射。玩家需操控小精灵,在迷宫内吞噬所有豆子,同时避开狡猾的鬼怪。当吃完所有豆子后,便可消灭鬼怪,赢得胜利。…

springboot197基于springboot的毕业设计系统的开发

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的毕业设计系统的开发 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 …

[AIGC] 利用 ChatGpt 深入理解 Java 虚拟机(JVM)的内存分布

深入理解 Java 虚拟机(JVM)的内存分布 Java 虚拟机(JVM)是 Java 编程语言的核心运行环境,它负责解释和执行 Java 字节码。在 JVM 中,内存被划分为几个不同的区域,每个区域都有特定的用途。了解…

stack的用法

介绍 翻译为栈&#xff0c;是一个后进先出的容器。 访问 只能通过top()函数来访问栈顶元素 常用函数 1.push(x):将x入队 2.top():获得队首元素 3.empty():判断是否为空 4.size():返回队内元素个数 #include <iostream> #include <stack>//引用stack头文件 us…

c++作业

Shell中的函数&#xff08;先调用后使用的原则&#xff09;&#xff08;没有申明&#xff09; &#xff08;Function&#xff09; 函数名&#xff08;有没有参数根据调用格式&#xff09;&#xff08;不能写任何内容&#xff09; { 函数体 Return 返回值 } 函数名 ----》…

Go语言中的加密艺术:深入解析crypto/subtle库

Go语言中的加密艺术&#xff1a;深入解析crypto/subtle库 引言crypto/subtle库概览ConstantTimeCompare函数深入解析ConstantTimeSelect函数应用详解ConstantTimeLessOrEq函数实践指南安全编程实践性能优化与最佳实践与其他加密库的比较总结 引言 在当今快速发展的互联网时代&…

作为一个程序员,最少要看过这几部电影吧?

计算机专业必看的几部电影 计算机专业必看的几部电影&#xff0c;就像一场精彩的编程盛宴&#xff01;《黑客帝国》让你穿越虚拟世界&#xff0c;感受高科技的魅力&#xff1b;《社交网络》揭示了互联网巨头的创业之路&#xff0c;《源代码》带你穿越时间解救世界&#xff0c;…

SG5032EEN晶体振荡器SPXO

5G将使通信流量呈指数级增长&#xff0c;5G通信网络需要高速和宽带&#xff0c;同时将噪声水平保持在最低水平&#xff0c;这可以通过通信设备的高频低抖动参考时钟来实现&#xff0c;使用上述晶体振荡器SPXO&#xff0c;客户可以输入一个具有极低相位抖动和功率的高频参考时钟…

P5194 Scales S——dfs(前缀和剪枝)

传送门https://www.luogu.com.cn/problem/P5194手切第一遍&#xff0c;没想到可以用前缀和剪枝&#xff0c;并且是从小到大搜了&#xff0c;不出意外40分TLEWA 第二遍&#xff1a;代码及思路 // Problem: // P5194 [USACO05DEC] Scales S // // Contest: Luogu // UR…

施美药业回复监管“二十问”:业务信披存疑,最大客户为关联方

近日&#xff0c;江西施美药业股份有限公司&#xff08;下称“施美药业”&#xff09;更新在深交所主板上市的申请审核动态&#xff0c;对深交所于2023年7月24日发布的第一轮审核问询函进行了回复。目前&#xff0c;深交所已发出第二轮审核问询函。 具体而言&#xff0c;施美药…

1、安装docker

$ sudo apt-get update安装 apt 依赖包&#xff0c;用于通过HTTPS来获取仓库: $ sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common添加 Docker 的官方 GPG 密钥&#xff1a; $ curl -fsSL https://mirrors.ustc.…

java:Java中的逻辑控制

顺序结构 在Java中&#xff0c;顺序结构是指代码按照从上到下的顺序依次执行。以下是一个简单的Java程序示例&#xff0c;展示了顺序结构的使用&#xff1a; public class SequenceStructureExample {public static void main(String[] args) {// 声明和初始化变量int num1 10…

cookie+session和token

总结说在前面&#xff1a; session&#xff1a;起源于服务端&#xff0c;保存在服务端&#xff08;服务器或者数据库&#xff09;&#xff0c;通过cookie传递给用户&#xff0c;用户每一次发送HTTP请求的时候&#xff0c;通过验证cookie中的session-id来验证用户身份。jwt(jso…

【C++关键字】auto以及指针空值nullpr

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 前言1.类型别名思考2…

数据源使用问题记录

一. Mysql "Zero date value prohibited" url上拼接 zeroDateTimeBehavior=convertToNull com.alibaba.druid.pool.DruidDataSource : create connection Error java.lang.ExceptionInInitializerError: null at com.mysql.jdbc.Util.stackTraceToString(Util.jav…

快速排序详解!c语言

目录 快速排序是什么&#xff1f; 快速排序的三种方法&#xff01; 快速排序的优化 1.hore法&#xff08;初代目&#xff09; hore法的源码 源码解析 2.挖坑法&#xff08;常用&#xff09;&#xff01;&#xff01;&#xff01;&#xff01; 挖坑法源码 3.前后指针法…

【Go语言最佳实践】通过消除错误来消除错误处理

你知道有什么比改进错误处理的语法更好吗&#xff1f;那就是根本不需要处理错误。 注意: 我不是说“删除你的错误处理”。我的建议是&#xff0c;修改你的代码&#xff0c;这样就不用处理错误了。 本节从 John Ousterhout 最近的著作“软件设计哲学”[9]中汲取灵感。该书的其中…