【JS】数据结构之栈
创始人
2024-03-08 12:27:35

文章目录

    • 基本介绍
    • 代码实现

基本介绍

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

  • 栈:是一种受限制的线性表。他遵循后进先出的原则(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))

在这里插入图片描述

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...