栈是一种 先进先出 的数据结构,所有涉及需要 先进先出 的思路解题时,都可以使用栈。
其次栈和递归也有些相似,递归也是先压栈,先进来的先出去,跟函数调用栈一样。
有效的括号
一道经典的用栈解决的问题。给定一个只包括 (
)
{
}
[
]
的字符串s,判断字符串是否有效。
有效字符串需要满足:
左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[()]}"
输出:true
这道题有一规律:
- 右括号前面,必须是对应的左括号,才能抵消
- 右括号前面,不是对应的左括号,那么该字符串一定不是有效括号
也就是左括号我们直接入栈即可,发现是右括号就要跟栈顶元素匹配(先进先出,后入栈的元素在栈顶, 这时栈顶的元素是最后一个入栈的左括号),不匹配就返回false
// 左右括号的建立对应关系
const mapping = {
'(': ')',
'{': '}',
'[': ']'
}
function isValid (str) {
const stack = []
const arr = str.split('')
for (let i = 0; i < arr.length; i++) {
const cur = arr[i]
if (mapping(cur)) { // 对象的属性的值存在,则属性一定存在。没必要用Object.kyes()判断
// 左括号直接入栈
stack.push(cur)
} else if (Object.values(mapping).some(i => cur === i)) { // 也可以不判断
// 右括号匹配栈顶元素
if (mapping[stack[stack.length - 1]] === cur) {
stack.pop() // 栈顶元素出栈
} else {
break // 直接跳过
}
}
}
return !stack.length
}
最小栈
设计一个支持 pop
push
top
的操作,并能在常数时间呢检索到最小元素的栈
- push(x) —— 将元素X推入栈中
- pop() —- 删除栈顶元素
- top() —- 获取栈顶元素
- getMin() —- 检索栈中的最小元素 ```javascript 示例:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); —> 返回 -3. minStack.pop(); minStack.top(); —> 返回 0. minStack.getMin(); —> 返回 -2.
提示: pop、top 和 getMin 操作总是在 非空栈 上调用。 ```