📚 栈、队列

  • 栈 Stack
    先入后出的容器结构,先进来的元素叠在一起,不能从后面出来元素

  • 队列 Queue
    先进先出,排队

  • 双端队列 Deque
    可以从前后两端进出

JS 实现这样的数据结构,会用数组模拟,加上push, pop, search方法


🤔 什么时候需要用栈、队列解题?

  • 栈:如果一个问题有最近相关性,我们可以考虑用栈来解决。现实生活中,很多工程都是像洋葱一样一层一层的从中心向外,而且最外层和最外层是一对,最内层和最内层一对。
  • 队列: 排队先来先买


🏫 经典题目

20.有效的括号

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 每个右括号都有一个对应的相同类型的左括号。

输入:s = “([])”
输出:true
题解:左到右扫描字符串,当扫描到左括号时,将其压入栈中;当扫描到有右括号时,从栈顶取出一个左括号。如果能够匹配,则继续扫描剩下的字符串。如果不能匹配,或栈中没有数据,则说明为非法格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var isValid = function (s) {
const map = { "{": "}", "[": "]", "(": ")" };
const leftArr = []; // 保存左括号的栈

for (let i in s) {
const t = s[i];
if (map[t]) {
leftArr.push(t);
} else if (t !== map[leftArr.pop()]) {
return false;
}
}
return !leftArr.length;
};


155. 最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素 val 推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

题解:这题的难点在于如何以 O(1)的时间复杂度获取栈中的最小元素?
用一个最小栈来维护数组每个时刻的最小值,当数组 pop 的时候,最小栈也 pop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
* initialize your data structure here.
*/
var MinStack = function () {
this.stack = [];
this.minStack = [Infinity];
};

/**
* @param {number} x
* @return {void}
*/
MinStack.prototype.push = function (x) {
this.stack.push(x);
this.minStack.push(Math.min(this.minStack[this.minStack.length - 1], x));
};

/**
* @return {void}
*/
MinStack.prototype.pop = function () {
this.minStack.pop();
this.stack.pop();
};

/**
* @return {number}
*/
MinStack.prototype.top = function () {
return this.stack[this.stack.length - 1];
};

/**
* @return {number}
*/
MinStack.prototype.getMin = function () {
return this.minStack[this.minStack.length - 1];
};

/**
* Your MinStack object will be instantiated and called as such:
* var obj = new MinStack()
* obj.push(x)
* obj.pop()
* var param_3 = obj.top()
* var param_4 = obj.getMin()
*/

柱状图中最大的矩形

接雨水