课程名称:JavaScript版数据结构与算法 轻松解决前端算法面试
课程章节:3-1 栈简介
主讲老师:lewis
知道什么是栈,学会对栈的基本操作。
一个后进先出的数据结构
因为在js里面没有栈这个东西,但是我们可以用数组来进行表示。
示例代码
const stack = []; // 入栈 stack.push(1); stack.push(2); // 出栈,移除数组的最后一项并返回它 const item1 = stack.pop(); const item2 = stack.pop();
上面的代码就提现了栈的后进先出的特性
所有需要后进先出的几个问题
十进制转二进制
如果要把十进制的数字转成二进制的话,就需要不停的除以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)
结果记录:
后续可以用到字典来进行优化