JS数据结构(栈结构)

什么是栈结构

1、栈结构是一种线性结构,而且是受限的线性结构

栈结构的执行机制

 观察上面的图片,我们可以将栈结构当做一个一头封死的玻璃圆管,而这个玻璃圆管的直径正好等于一个乒乓球的直径;一开始,玻璃圆管中什么都没有,空空如也,此时的玻璃管,也就是我们图中所说的空栈

然后我和我的小伙伴准备去打乒乓球,于是我们去了楼下的小卖铺买了三个乒乓球,我们为了方便,把这三个乒乓球分别命名乒乓球1,乒乓球2,乒乓球3,并将它们按顺序装入了玻璃罐中,我们放入乒乓球的动作,就是栈结构的入栈

最后我们到了打乒乓球的地点,我们想要拿出其中的一个乒乓球,而这个拿的过程,我们在栈结构中我们就称之为出栈;

由于我们此时乒乓球之前是按照(乒乓球1,乒乓球2,乒乓球3的顺序放入其中的),那么此时我们想要拿一个乒乓球,且玻璃水管的直径正好是乒乓球的直径,所以我们不能用手随意的去抓取,那么只能依次取出,那么,首先取出的必定是最后放进去的乒乓球3,然后依次是乒乓球2、乒乓球1;

我们可以发现其中一个道理:最先放进去的乒乓球只能最后拿出来,反而最后放进去的乒乓球最先取出;

而这,正是栈结构的最大特性:先进后出,后进先出

而放球与拿球的动作,则称为入栈和出栈,而最上面的一个乒乓球,我们称之为栈顶

而此时,我们有买来乒乓球4,此时我们想将他放在2和3之间,我们只能先取出乒乓球3,此时的2成为了栈顶,然后再放入乒乓球4,然后在放入3;而绝不可能在乒乓球2和3之间硬塞一个乒乓球4;也就意味着,我们在最上面的一个乒乓球,也是是栈顶上进行操作;要想中间插入,必须使被插入的地方成为栈顶;

其实可以理解为,栈结构,只能在栈顶进行操作;同样也可以理解,栈结构指适用于放入和取出,插入可以,但效率不高;

基于数组实现

栈结构基于数组实现,其实对于使用TS或JS的人员来说,还是比较容易实现的,它只不过是实现了前端数组中的某些方法

class Stack {
    arr: number[];
    // 定义栈中的属性
    constructor() {
        this.arr = []
    }
    // 栈的相关操作
    // 压栈操作
    push = (parms: number) => {
        this.arr.push(parms)
    }
    // 出栈操作
    pop = () => {
        return this.arr.pop()
    }
    // 查看栈顶元素
    checkStackTop = () => {
        return this.arr[this.arr.length - 1]
    }
    // 判断栈是否为空
    isEmpty = () => {
        return this.arr.length === 0
    }
    // 取出栈中的元素个数
    size = () => {
        return this.arr.length
    }
    // 重写toString方式
    toString = (params) => {
        return this.arr.join(params)
    }
}

// 栈的使用
let example = new Stack();
example.push(1);//[1]
example.push(2);//[1,2]
example.pop();//2
example.size();//1

 这里,我使用class创建类的方式,为栈结构实现了栈结构必须有的压栈与弹栈的行为,还有一些辅助类的方式,例如查看栈中元素的个数,重写了一下toString方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值