剑指–包含min函数的栈
1,题目:

2,思路:
- 1.push(x) 函数: 重点为保持栈 B 的元素是 非严格降序 的。
- 2.将 x 压入栈 A (即 A.add(x) );
- 3.若 ① 栈 B 为空 或 ② x 小于等于 栈 B 的栈顶元素,则将 x压入栈 B(即 B.add(x) )。
- 4.pop() 函数: 重点为保持栈 A,B 的 元素一致性 。
- 5.执行栈 A 出栈(即 A.pop() ),将出栈元素记为 y ;
- 6.若 y 等于栈 B 的栈顶元素,则执行栈 B 出栈(即 B.pop() )。
- 7.top() 函数: 直接返回栈 A 的栈顶元素即可,即返回 A.peek() 。
- 8.min() 函数: 直接返回栈 B 的栈顶元素即可,即返回 B.peek() 。
下面是对应的图解:









3,代码:
class MinStack {
/*
1.push(x) 函数: 重点为保持栈 B 的元素是 非严格降序 的。
2.将 x 压入栈 A (即 A.add(x) );
3.若 ① 栈 B 为空 或 ② x 小于等于 栈 B 的栈顶元素,则将 x压入栈 B(即 B.add(x) )。
4.pop() 函数: 重点为保持栈 A,B 的 元素一致性 。
5.执行栈 A 出栈(即 A.pop() ),将出栈元素记为 y ;
6.若 y 等于栈 B 的栈顶元素,则执行栈 B 出栈(即 B.pop() )。
7.top() 函数: 直接返回栈 A 的栈顶元素即可,即返回 A.peek() 。
8.min() 函数: 直接返回栈 B 的栈顶元素即可,即返回 B.peek() 。
*/
Stack<Integer> A, B;
public MinStack() {
A = new Stack<>();
B = new Stack<>();
}
public void push(int x) {
A.add(x);
if(B.empty() || B.peek() >= x)
B.add(x);
}
public void pop() {
if(A.pop().equals(B.peek()))
B.pop();
}
public int top() {
return A.peek();
}
public int min() {
return B.peek();
}
}
本文详细解析了一种特殊的数据结构——包含min函数的栈,通过维护两个栈A和B,确保了O(1)的时间复杂度下完成min函数的操作。文章通过具体的步骤和代码,展示了如何在压栈、弹栈、获取栈顶元素和查找最小值的过程中,既保持了栈的特性,又实现了高效查找最小值的功能。
741

被折叠的 条评论
为什么被折叠?



