在前端路上想要进阶,算法和数据结构是必须要了解的。虽然很久之前就立flag要开始刷 LeetCode,但是每次都是水几道题就不了了之。今年的flag又立起来:坚持学习算法。
种一棵树最好的时间是十年前,其次是现在。那么就从这一周开始刷题学习吧!
栈的理解
栈是一种只允许在一端插入和删除数据的线性表。栈中的数据遵循着后进先出、先进后出的规则。
在日常生活中,栈的例子有很多。比如搬家的时候,我们会把衣服(数据)依次放入箱子(栈)中,到了新家,再打开箱子把衣服一件一件拿出来。箱子顶部的衣服是最后放进去最先拿出来,而底部的衣服则是最先放进去最后拿出来。
栈的基本操作
从栈的定义里,我们知道,栈主要包含两种操作,入栈和出栈。
push(e):入栈,从栈顶压入数据
pop():出栈,从栈顶取出数据
由于JS数组本身具备了push和pop方法,所以我们在需要使用的栈这种数据结构的时候,可以直接用JS数组。
有效的括号
在前端算法面试中,出现频率非常高的一道题就是有效的括号,题目描述如下:
这是栈的一个经典应用。首先,我们声明一个栈,用来保存未匹配的左括号;然后,从左到右遍历字符串s。
当遇到左括号时,则将其入栈(push);遇到右括号时,从栈顶取出(pop)一个左括号,与该右括号进行匹配。如果能够匹配,则继续遍历剩下的字符串,否则字符串 s 无效。
当所有的括号都遍历完后,如果栈为空,说明左右括号完全匹配,并且没有多余的左括号,字符串 s 有效;否则,说明有未匹配的左括号,字符串无效。
va