目录
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/
思路分析
设置两个栈s1和s2,s1正常压入弹出,s2负责存储每次要push进新元素时,该元素对应的栈里的最小值,比如向空栈s1里压入-2,最小值就是它本身,所以s2也压入-2;继续向s1里压入0,与s2的顶部元素-2比,此时的栈s1的最小值还是-2,所以向s2压入-2,而不是0;继续向s1里压入-3,与s2的顶部元素-2比,此时s1的最小值是-3,所以向s2里压入-3.
- push ,s1直接push,s2需拿顶部元素与待push的元素比较大小,push值较小的那一个;
- pop ,s1直接pop,s2也直接pop,s2pop了s1中被pop元素对应的栈的最小值;
- top ,返回s1.top();
- min ,返回s2.top();
C++代码
class MinStack {
public:
/** initialize your data structure here. */
stack<int> s1;
stack<int> s2;
MinStack() {
}
void push(int x) {
s1.push(x);
if(s2.empty()) s2.push(x);
else {
if(s2.top()<x) s2.push(s2.top());
else s2.push(x);
}
}
void pop() {
if(s1.empty()) return;
s1.pop();
s2.pop();
}
int top() {
if(s1.empty()) return -1;
return s1.top();
}
int min() {
if(s2.empty()) return -1;
return s2.top();
}
};