第一模块:课程介绍
课程名称:JavaScript版数据结构与算法 轻松解决前端算法面试
课程章节:3-1 栈简介
主讲老师:lewis
第二模块:课程内容
知道什么是栈,学会对栈的基本操作。
第三模块:课程收获
1. 栈是什么?
一个后进先出的数据结构
因为在js里面没有栈这个东西,但是我们可以用数组来进行表示。
示例代码
const stack = [];
// 入栈
stack.push(1);
stack.push(2);
// 出栈,移除数组的最后一项并返回它
const item1 = stack.pop();
const item2 = stack.pop();
上面的代码就提现了栈的后进先出的特性
2. 什么场景下使用栈
所有需要后进先出的几个问题
十进制转二进制
如果要把十进制的数字转成二进制的话,就需要不停的除以2,得到余数,最后把所有的余数都收集起来,得到二进制的数据
这个余数的排序也是有要求的,后出来的余数要排在前面。
也就是先进后出的特点。
判断字符串的括号是否有效
(((()))) --- valid
()()() --- valid
((() --- invalid
看上面的这个问题,可以假设我们有个左括号的栈,每进去一个左括号,就要有一个对应的右括号,这样,我们在数的时候,可以假设把左括号都堆起来,然后呢,当有一个右括号的时候,就删除一个左括号,就完成了判断了
解题步骤
- 新建一个栈
- 扫描字符串,遇到左括号入栈,遇到和栈顶括号类型匹配的右括号就出栈,类型不匹配直接判定位不合法
- 最后栈空了就合法,否则不合法。
示例代码:
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
// 定义下符号
const fuhao1 = ['(', '[', '{'];
const fuhao2 = [')', ']', '}'];
const zhan1 = [];
if(fuhao2.includes(s[0])){
return false;
}
for (let i = 0; i < s.length; i++) {
// 遇到左括号,入栈
if(fuhao1.includes(s[i])){
zhan1.push(s[i]);
}else {
// 遇到右括号,判断右括号是否对应左括号
if(fuhao1.indexOf(zhan1[zhan1.length - 1]) !== fuhao2.indexOf(s[i])){
// 两个不一样,就返回false
return false;
}else {
zhan1.pop();
}
}
}
return zhan1.length === 0;
};
优化方向
- 字符串的长度如果是奇数,就肯定是失败的了
if(s % 2 === 1) return false;
总结
新建的变量会增加空间复杂度,也就是说zhan1会使用n个内存地址,也就是o(n)。我们的for循环带来了时间的复杂度o(n)
结果记录:
后续可以用到字典来进行优化
第四模块:课程记录
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦