JavaScript数据结构与算法--栈

本文介绍了栈这种数据结构的基本概念,包括其LIFO(后进先出)特性。深入探讨了函数调用栈的工作原理,通过示例说明了函数调用时栈的变化。同时,给出了栈的实现,包括入栈、出栈等基本操作,并提供了栈的JavaScript实现。文章还提及了无停止条件的递归导致栈溢出的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、认识栈

1、栈是一种受限的线性表,不同于数组可以在任意位置添加或删除元素,栈限制仅允许在它的其中一端进行元素的添加(称为进栈、入栈或者压栈)和删除(出栈或退栈),而这一端称为栈顶,另一端则叫栈底。
2、栈遵循LIFO(last in first out)原则,即后进先出。

二、函数调用栈

假如A函数中调用B,B调用C,C调用D;那么在A执行的过程中会将A压入栈,B执行时B也被压入栈,函数C和D执行时也会被压入栈。所以当前栈的顺序为:(栈底)A->B->C->D(栈顶);函数D执行完之后,会弹出栈被释放,弹出栈的顺序为D->C->B->A;
另外,为什么没有停止条件的递归会造成栈溢出?因为函数不断调用自身,不停地把相同的函数压入到栈里面,而函数本身又没有执行完,不会出栈,所以栈里面会有越来越多的函数,导致栈溢出。

三、栈的操作

function Stack() {
  this.items = []
  //栈的基本操作
  //1、入栈
  Stack.prototype.push = function (element) {
    this.items.push(element)
  }
  //2、出栈
  Stack.prototype.pop = function () {
    return this.items.pop()
  }
  //3、查看栈顶元素
  Stack.prototype.peek = function () {
    return this.items[this.items.length - 1]
  }
  //4、判断栈是否为空
  Stack.prototype.isEmpty = function () {
    return this.item.length === 0;
  }
  //5、返回栈里面的元素个数
  Stack.prototype.size = function () {
    return this.items.length
  }
  //6、移除栈的所有元素
  Stack.prototype.clear = function () {
    this.items = []
  }
  //7、以字符串形式输出栈内数据
  Stack.prototype.toString = function () {
    let resultString = ''
       for (let i of this.items){
         resultString += i + ' '
        }
     return resultString   
  }
}
let a = new Stack();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值