首页 > 编程语言 >JavaScript实现数据结构 -- 栈

JavaScript实现数据结构 -- 栈

时间:2022-10-20 23:35:34浏览次数:49  
标签:const 入栈 -- JavaScript pop 括号 出栈 数据结构 stack

栈是一种==后进先出==的数据结构。

图片来源于网络

JS模拟栈

虽然JavaScript中没有栈,但是我们可以用数组来实现栈的功能。

	// 定义一个数组用来模拟栈
	const stack = [];
	// 用数组的Push方法模式入栈
	stack.push(0);
	stack.push(1);
	stack.push(2);
	// 用数组的pop方法模拟出栈
	const item0 = stack.pop();
	const item1 = stack.pop();
	const item2 = stack.pop();

入栈出栈过程

入栈过程

执行第4行代码,将0入栈。 在这里插入图片描述 执行第5行代码,将1入栈。 在这里插入图片描述 执行第6行代码,将2入栈。 在这里插入图片描述

出栈过程

执行第8行代码,将2出栈。

在这里插入图片描述 执行第9行代码,将1出栈。 在这里插入图片描述 执行第10行代码,将0出栈。 在这里插入图片描述

栈的应用

有后进先出特点的问题,都可以尝试用栈来解决。

例:有效的括号(leetcode:20)

leetcode

思路

{ [ ( ) ] }

越靠后的左括号,对应的右括号越靠前;

第一步:扫描字符串将左括号入栈;

第二步:判断栈顶括号,和入栈的右括号类型是否匹配;

匹配则出栈栈顶的左括号;

不匹配直接判定不合法;

第三步:如果最后栈不为空,则判定不合法;

代码

var isValid = function(s) {
	//优化:判断字符串长度是否为奇数,为奇数判断不合法。
    if(s.length % 2 ===1){
        return false;
    }
    // 新建一个栈
    const stack = [];
    // 扫描字符串
    for(let i = 0; i < s.length; i++){
        const c = s[i];
        // 左括号入栈
        if(c === '(' || c === '[' || c === '{'){
            stack.push(c);
        }else{
            // 栈顶指针
            const t = stack[stack.length-1];
            // 判断栈顶指针和右括号类型是否匹配
            if( (t === '(' && c ===')') || (t === '[' && c ===']') || (t === '{' && c ==='}')){
                // 类型匹配栈顶指针出栈
                stack.pop();
            }else{
                // 类型不匹配,循环结束
                return false;
            }
        }
    }
    return stack.length === 0;
};

在这里插入图片描述

标签:const,入栈,--,JavaScript,pop,括号,出栈,数据结构,stack
From: https://blog.51cto.com/u_15718546/5780798

相关文章

  • JavaScript实现数据结构 -- 队列
    队列队列是一个先进先出的数据结构。JS模拟队列虽然JavaScript中没有队列,但是我们可以用数组来实现队列的功能。 //用数组来模拟队列 constqueue=[]; //入队 q......
  • 操作系统导论 pdf
    作者:[美]RemziH.Arpaci-Dusseau/[美]AndreaC.Arpaci-Dusseau出版社:人民邮电出版社原作名:OperatingSystems:ThreeEasyPieces译者:王海鹏 链接:超标量......
  • TabControl控件
    TabControl控件,页面集合用于管理一个TabPages集合,每个TabPage都是一个容器控件 常用属性:MultiLine,TabPages,AlignMent,Appearance,ItemSize,ImagesList  知识点1:Mu......
  • Oracle中rownum和row_number()
    row_number()over(partitionbycol1orderbycol2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。与rownu......
  • k8s安装redmine
    ​课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。腾讯课堂连接地址https://ke.qq.com......
  • Docker_基础知识
    容器概述容器本义:盛装物体、隔离物体。容器意义:解决虚拟化资源浪费的问题。容器沿革:1979---2013---                    版本:企业版(EE)/社区版(CE)1.......
  • JavaScript实现数据结构 -- 链表
    链表链表和数组一样是有多个元素组成的列表;不同的是链表元素存储不连续,用next指针连接在一起;链表的特点插入、删除不需要移动元素;不必事先分配存储空间;所需空间与长......
  • golang中的切片
    索引:https://waterflow.link/articles/1666277946416在go中切片的底层是数组,所以切片的数据连续存储在数组的数据结构中。如果底层的数组满了,切片还需要添加元素的话,底层数......
  • C语言多路开关模式的switch语句
    C语言多路开关模式的switch语句将switch语句中有的语句块的break删除掉。使多个语句块输出同一个。例子:输入一个月份,判断是几月份。#define_CRT_SECURE_NO_WARNINGS1#incl......
  • 【Oracle】准实时大规模数据提取
    文中使用的Oracle版本为10g。这篇文章是之前本人在前公司内部做可行性分析报告中的其中一个板块的内容,具体讲述的是为了做大规模数据提取和数据清洗做了一个试验demo。先说......