栈是什么?
栈是一个后进先出的数据结构,js中并没有栈,但是可以用Array来模拟栈
/*新建一个栈*/
const stack = []
/*入栈*/
stack.push(1)
stack.push(2)
/*出栈*/
const item1 = stack.pop()
const item2 = stack.pop()
栈的常用操作
- Array.push
- Array.pop
- 栈顶(stack[ stack.length - 1])
什么场景需要栈
- 需要后进先出的场景
- 十进制转二进制
- 判断字符串括号是否有效
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
};
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-parentheses
解题思路:
1.新建一个栈
const stack = []
2.扫描字符串(遍历)
for(let i = 0;i<s.length;i++){
}
3.遇到左边的括号('(','{','[' ) 就入栈
for(let i = 0;i<s.length;i++){
const c = s[i]
if(c ==='(' || c === '{' || c==='['){
stack.push(c)
}
}
4.遇到和栈顶括号类型匹配的右括号就出栈,类型不匹配就不合法,
for(let i = 0;i<s.length;i++){
const c = s[i]
if(c ==='(' || c === '{' || c==='['){
stack.push(c)
}else{
const top = stack[stack.length - 1]
if(
(top === '(' && c === ')') ||
(top === '{' && c === '}') ||
(top === '[' && c === ']')
){
stack.pop()
}else {
return false
}
}
}
return stack.length === 0
5.最后栈空就合法
结语
目前的时间复杂度是O(n),当然我这并不是最优解(而是菜鸡解法- -!),不过学习都是从简单的学起,如果大家有更好的想法,可以评论一下,大家一起学习