这篇文章为大家介绍栈(Stack)。
什么是栈?
栈全称为堆栈,简单来说就一种数据,特点是先进后出。在栈中只有两种基本操作,插入-入栈和删除-出站,记住栈只有一端可以进行入栈和出栈操作,我们将其称为栈顶,另一端称其为栈底;如下图展示了栈这个数据结构:
JavaScript中的栈
其实JavaScript的栈并没有数据类型,需要数组进行模拟,其中要知道的就是提供的push()和pop()选项,这样也正好符合栈的特点,
示例代码如下:
const stack = [] // 入栈 stack.push(1) stack.push(2) // 出栈 const v1 = stack.pop() // 2 const v2 = stack.pop() // 1
栈的应用场景
其实栈是算法和程序中最常用的辅助结构,先进后出场景中我们都可以见到栈的身影,比如:
函数调用堆栈
判断字符串括号是否有效
接下来我们依次来看:
函数调用堆栈
JavaScript中的函数调用堆栈就是一个应用栈的一个典型例子,比如下面这段代码:
function f1() {} function f2() { f1() } function f3() { f2() } f3()
如下图:
执行过程如下:
调用函数f3(),将f3压入堆栈;
在f3()中调用了f2(),将f2压入堆栈;
在f2()中又调用了f1(),将f1压入堆栈;
只有f1()运行完成才能继续往下执行,所以f1()先出栈,以此类推。
有效的括号
有效的括号是力扣中的一个关于栈的算法题目,题目大意就是判断给定字符串中的括号是否匹配,匹配返回true,否则返回false。
解题思路如下:
判断字符串主要是判断长度是否偶数,当时奇数时直接返回false,实现这主要是括号都是成对出现的;
新建一个栈;
遍历字符串,遍历到每一项时如果时左括号,将其压入栈;如果是右括号,与栈顶对比,如果相匹配则出栈,不匹配则返回false。
实现代码如下:
/** * @param {string} s * @return {boolean} */ var isValid = function(s) { if (s.length % 2 !== 0) 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 } } } // 如果为0表示全部匹配,有剩余则表示不匹配 return stack.length === 0 };
这里些的代码虽然看起来简单粗暴,但也非常实用。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/127818.html
摘要:包括了,新项目的人员架构熟悉,产品的架构学习,技术栈的了解,开发流程的熟悉。今天给大家介绍几个快速了解产品技术栈的工具。希望可以帮助大家在接触新项目的时候,可以快速了解到产品使用的技术栈。 起因 测试人员在介入到新项目的时候,总会有个一迷(xue)茫(xi)时期,里面会面临很多的挑(ji)战(yu)。包括了,新项目的人员架构熟悉,产品的架构学习,技术栈的了解,开发流程的熟悉。 如果想要...
摘要:让你收获满满码个蛋从年月日推送第篇文章一年过去了已累积推文近篇文章,本文为年度精选,共计篇,按照类别整理便于读者主题阅读。本篇文章是今年的最后一篇技术文章,为了让大家在家也能好好学习,特此花了几个小时整理了这些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 让你收获满满! 码个蛋从2017年02月20...
摘要:本文是作者自己对中线程的状态线程间协作相关使用的理解与总结,不对之处,望指出,共勉。当中的的数目而不是已占用的位置数大于集合番一文通版集合番一文通版垃圾回收机制讲得很透彻,深入浅出。 一小时搞明白自定义注解 Annotation(注解)就是 Java 提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法。Annotion(注解) 是一个接口,程序可以通过...
摘要:的出现解决了这尴尬的问题,非阻塞模式下,通过,我们的线程只为已就绪的通道工作,不用盲目的重试了。注意要将注册到,首先需要将设置为非阻塞模式,否则会抛异常。 同步、异步、阻塞、非阻塞首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]。 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节)。 异步:相对于同步,API调用返回时调用者不知道操作...
阅读 481·2023-03-27 18:33
阅读 688·2023-03-26 17:27
阅读 591·2023-03-26 17:14
阅读 559·2023-03-17 21:13
阅读 476·2023-03-17 08:28
阅读 1720·2023-02-27 22:32
阅读 1217·2023-02-27 22:27
阅读 2032·2023-01-20 08:28