【JS】数据结构之栈

news2024/10/5 15:29:26

文章目录

    • 基本介绍
    • 代码实现

基本介绍

内存中的堆栈和数据机构中的堆栈不是一个概念,内存中的堆栈是真实存在的物理区,数据结构中的堆栈是抽象数据存储结构。

  • 栈:是一种受限制的线性表。他遵循后进先出的原则(LIFO)
  • 其限制是仅允许在表的一端进行插入和删除运算,这一端被称为栈顶,相对的另一端称为栈底。
  • 最开始的时候,栈是不含有任何数据的,叫做空栈。
  • 向一个栈插入新元素称为入栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。
  • 从一个栈删除元素又称之为出栈,他是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

在这里插入图片描述

我们可以利用栈这个数据结构,理解JS的运行机制之:JS调用栈

  • 执行上下文:就是当前JS代码被解析和执行所在环境的抽象概念。
  • JS中任何代码都是在执行上下文中运行的(执行环境)
  • JS 执行上下文分三种:
1. 全局执行上下文:先创建全局对象,再将this指向这个全局对象。
2. 函数执行上下文:每次调用函数的时候,会为这个函数创建一个新的执行上下文。
3. Eval函数执行上下文:`eval()`
  • 示例:
const one = () => {
	two();
	console.log('我是one');
}
const two = () => {
	console.log('我是two');
}
one();
  • JS引擎创建一个新的全局执行上下文,并将这个执行上下文推入当前的执行栈中。
  • 执行栈用于存储在代码执行期间创建的所有的执行上下文。
- 每当发生函数调用的时候,JS引擎都会为该函数创建一个新的执行上下文并push到当前执行栈的栈顶。
- 当调用 one 函数的时候,JS引擎都会为该函数创建一个新的执行上下文并推到当前执行栈的栈顶。
- 当调用 two 函数的时候,JS引擎都会为该函数创建一个新的执行上下文并推到当前执行栈的栈顶。
- 当two函数调用完毕后,他的执行上下文就会从当前执行栈中弹出,上下文的控制权移到当前执行栈中的下一个执行上下文:one 函数

我们可以利用栈这个数据结构,理解JS的运行机制之:递归的原理

  • 函数的调用本质:入栈和出栈操作。
  • 但是函数在调用栈里面有个特例,那就是递归(自己调自己)。
  • 先进栈,到条件后再出栈,如果不出栈,就会导致:栈溢出(栈的容量是有限的)
  • 示例:阶乘n!(5! = 54321)
const factor = (n)=>{
	// 递归要有出口,否则就是死循环
	if(n === 1){
		return 1;
	}
	return n * factor(n - 1);
}
console.log(factor(3));	// 6
console.log(factor(10));	// 3628800
  • 函数在内存中调用,会形成一个调用记录,又称为调用帧
  • 递归可能需要同时保存成百上千个调用帧,很容易发生栈溢出。
  • 但是对于尾递归来说,由于只存在一个调用栈,所有不会发生栈溢出错误
// 尾调用
function a(x){}
function b(x){
	return a(x);
}
// 尾调用自身就是尾递归
const factor = (n, total)=>{
	if(n === 1){
		return total;
	}
	return factor(n - 1, n * total);
}
  • 示例:斐波那契数列(从第三项开始,每一项等于前两项的和:1,1,2,3,5,8,13)
// 递归
const Fibonacci = (n) => {
	if(n<=1){
		return 1;
	}
	return Fibonacci(n-1)+Fibonacci(n-2);
}
/*
	会存在一个重复计算问题
	n = 5, Fibonacci(4)+Fibonacci(3)
	n = 4, Fibonacci(3)+Fibonacci(2)
	...
*/
console.log(Fibonacci(50));	// 运行直接卡死
// 尾递归
// 把前面2位数,当作参数传进来
const Fibonacci = (n, ac1=1, ac2=1) => {
	if(n<=1){
		return ac2;
	}
	return Fibonacci(n-1, ac2, ac1+ac2);
}
console.log(Fibonacci(50));	// 运行就很流畅

代码实现

栈的应用有:十进制转二进制

  • 使用JavaScript实现一个栈结构
class Stack{
	constructor() {
		this.items = [];
	}
	// 入栈
	push(ele){
		this.items.push(ele);
	}
	// 出栈
	pop() {
		return this.items.pop();
	}
	// 获取栈顶元素
	peek(){
		return this.items[this.items.length - 1];
	}
	// 查看栈是否为空
	isEmpty(){
		return this.items.length === 0;
	}
	// 查看栈中元素个数
	size(){
		return this.items.length;
	}
	// 清空栈
	clear(){
		this.items = []
	}
}

const stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);

console.log(stack);

// 十进制转二进制
const binary = (number) =>{
	let stack = new Stack();
	let remainder = 0;
	let top = '';
	while(number > 0){
		// 除于2取余数
		remainder = number % 2;
		stack.push(remainder);
		// 向下取整
		number = Math.floor(number / 2);
	}
	// 不为空的时候
	while(!stack.isEmpty()){
		// 栈顶元素
		top += stack.pop();
	}
	return top;
}
console.log("2 = ", binary(2))

在这里插入图片描述

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

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

相关文章

神仙级编程神器,吹爆

Visual Studio 编程领域公认的“最强IDE”&#xff0c;Visual Studio是目前最流行的Windows平台应用程序的集成开发环境&#xff0c;提供了高级开发工具、调试功能、数据库功能和创新功能&#xff0c;帮助在各种平台上快速创建当前最先进的应用程序&#xff0c;开发新的程序。 …

【ODX介绍】-5-用于Flash刷写的ODX-F文件概述

总目录:(单击下方链接皆可跳转至专栏总目录) 《UDS/OBD诊断需求编辑工具》总目录https://blog.csdn.net/qfmzhu/article/details/123697014 共9页精讲:在第二章节中,附上了一个完整的,且详细的ODX-F文件层级结构图。 目录 1 什么是ODX-F?

【在Spring MVC框架和Spring Boot项目中,控制器的响应结果】

目录 1. 控制器的响应结果 2. 相关配置 3. 使用枚举优化代码 1. 控制器的响应结果 当控制器处理了请求之后&#xff0c;向客户端响应的结果中&#xff0c;应该至少包含&#xff1a; 业务状态码&#xff1a;通常是数值类型的&#xff0c;客户端可以根据此数值来判断操作成功…

docke部署nodejs程序及Dockerfile详解

目录参考一、Dockerfile二、部署1、程序结构2、新建Dockerfile3、新建.dockerignore4、构建镜像5、创建容器6、关闭镜像参考 重点参考&#xff1a;把一个 Node.js web 应用程序给 Docker 化 Docker部署Node.js的方法步骤&#xff08;nodejs docker部署&#xff09; 一、Docke…

Linux服务器启动tomcat的三种方式

直接进入主题&#xff0c;首先cd进入tomcat的bin文件夹下&#xff0c;然后可以尝试以下三种启动方式&#xff1a; 第一种&#xff08;当前会话启动&#xff09;&#xff1a; ./startup.sh 效果: 然后tomcat就在后台启动了&#xff0c;我们还可以在当前会话中继续输入其它指令…

PHP基于thinkphp的网上书店管理系统#毕业设计

本论文主要论述了如何使用php语言开发一个网上图书管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;将论述网上图书管理系统的当前背景以及系统开发的目的&#xff0c;后续章节将严格按照软…

【python】 16进制字符串转list

def splitStringToByteList(bytesString): # 拆分字符串成字节列表bytesList []for i in range(int(len(bytesString)/2)):bytesList.append(bytesString[i*2:i*22])return bytesListif __name__ __main__:print(splitStringToByteList("1E1E2AEB4ACC4C")) 结果&…

shiro key文件

​下面结合实战以及shiro的CookieRememberMeManaer的调用过程,浅谈获取shiro key文件的几种方式。 shiro key文件的获取方式:1结合Dnslog与URLDNS;2利用时间延迟或报错;3结合CookieRememberMeManaer 1结合Dnslog与URLDNS 在进行漏洞探测的时候,一般会使用ysoserial-URL…

Codeforces Round #835 (Div. 4)A.B.C.D.E.F

A. Medium Number 题目链接&#xff1a; Problem - A - Codeforces 题面&#xff1a; 题意&#xff1a; 给定三个数&#xff0c;求中间那个数的值 思路&#xff1a; 我们可以分别求出三个数的总和&#xff0c;最大值和最小值&#xff0c;在通过总和减最大值和最小值的方…

Promise(微任务)- 让你看完就懂

1. 图示 思维导图链接 https://www.zhixi.com/view/23ff2291 2. 使用promise原因 在没有promise的时候&#xff0c;一直使用setTimeout函数&#xff0c;这样就会造成回调地狱。 3. 基本状态 promise 有三种状态 pending&#xff08;此时 promise还没有调用完成&#xff09…

改进花朵授粉算法的无线传感器网络部署优化(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

某汽车座椅进行的头冲吸能实验的仿真计算

本案例运用hypermesh和lsdyna联合仿真&#xff0c;主要是针对某座椅进行的头冲吸能实验的仿真计算。这个工况考察座椅背部的塑料件的破坏情况&#xff0c;以及头部模块的加速度情况&#xff0c;达到保护人头部的效果。 本案例用户可以学习到&#xff1a; 1、螺栓预紧力的施加…

IntelliJ IDEA + spring-boot+mysql简单实现获取数据库数据接口例子

一、新建一个spring-boot项目 demo 项目结构与文件的含义&#xff1a; 二、项目编译入口代码 DemoApplication.java SpringBootApplication //EnableAutoConfiguration(exclude{DataSourceAutoConfiguration.class}) public class DemoApplication {public static void main(…

Linux系统编程

Linux系统中所见皆文件 bin&#xff1a;所存放二进制可执行文件 boot&#xff1a;存放开机启动程序 dev&#xff1a;存放设备文件 home&#xff1a;存放用户 etc&#xff1a;用户信息和系统配置文件 lib&#xff1a;库文件 root&#xff1a;管理员宿主目录&#xff08;家目录&…

Linux计划任务管理,网络管理

一&#xff0c;计划任务管理&#xff1a; 任务管理很宽泛&#xff0c;这里是指的计划任务管理&#xff0c;在指定的时间执行。 at命令 &#xff1a; 由atd守护进程来执行&#xff0c;atd进程会定期检查系统上的 /var/spool/at 目录&#xff0c;获取at命令写入的任务。 &#x…

Linux CentOS系统安装mysql8.0.31(tar方式)

Linux系统安装mysql8.0.31&#xff08;TAR方式&#xff09; 文章目录Linux系统安装mysql8.0.31&#xff08;TAR方式&#xff09;安装包的下载安装Mysql8.0.31注册成系统服务并自启动问题总结启动异常一简单使用安装包的下载 选择的是 MySQL Community Server 进行下载 官网下…

第4季1:将AR0130摄像头更换为OV9712摄像头

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、SoC对Sensor的支持情况 在海思SDK的Hi3518E V200R001C01SPC030\00.hardware\chip\document_cn目录下&#xff0c;我们重点关注这两个文档&#xff1a;《Hi3518EV200经济型HD IP Camera SoC产品…

wordpress插件-wordpress蜘蛛记录插件

wordpress蜘蛛插件&#xff0c;我们为什么要wordpress装蜘蛛插件&#xff0c;一个合格的SEO人员必须懂得分析网站的蜘蛛情况&#xff0c;wordpress蜘蛛插件可以让我们分析出各大搜索引擎蜘蛛的访问间隔频率&#xff0c;以及最受蜘蛛喜爱的页面&#xff0c;让你精确地分析搜索引…

Unity DOTS学习 前置知识(二)

ECS 架构和一些专用术语 Entity-Component-System 实体组件系统(ECS )架构遵循组合优于继承的原则面向数据设计弱耦合常被应用在游戏开发上 本质&#xff1a;组合的是数据数组而非对象数组 ECS示例图&#xff1a; Entity 虽然叫做实体&#xff0c;但是并非对象或容器&…

[网络工程师]-应用层协议-FTP

文件传输协议&#xff08;File Transfer Protocol&#xff0c;FTP&#xff09;简称为“文件协议”&#xff0c;用于在Internet上控制文件的双向传输。客户上传文件时&#xff0c;通过服务器20端口建立的连接是建立在TCP之上的数据连接&#xff0c;通过服务器21号端口建立的连接…