栈、队列
📚 栈、队列
栈 Stack
先入后出的容器结构,先进来的元素叠在一起,不能从后面出来元素队列 Queue
先进先出,排队双端队列 Deque
可以从前后两端进出
JS 实现这样的数据结构,会用数组模拟,加上push
, pop
, search
方法
🤔 什么时候需要用栈、队列解题?
- 栈:如果一个问题有最近相关性,我们可以考虑用栈来解决。现实生活中,很多工程都是像洋葱一样一层一层的从中心向外,而且最外层和最外层是一对,最内层和最内层一对。
- 队列: 排队先来先买
🏫 经典题目
20.有效的括号
给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
输入:s = “([])”
输出:true
题解:左到右扫描字符串,当扫描到左括号时,将其压入栈中;当扫描到有右括号时,从栈顶取出一个左括号。如果能够匹配,则继续扫描剩下的字符串。如果不能匹配,或栈中没有数据,则说明为非法格式。
1 | var isValid = function (s) { |
155. 最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
- MinStack() 初始化堆栈对象。
- void push(int val) 将元素 val 推入堆栈。
- void pop() 删除堆栈顶部的元素。
- int top() 获取堆栈顶部的元素。
- int getMin() 获取堆栈中的最小元素。
题解:这题的难点在于如何以 O(1)的时间复杂度获取栈中的最小元素?
用一个最小栈来维护数组每个时刻的最小值,当数组 pop 的时候,最小栈也 pop
1 | /** |