1,题目要求
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
2,题目思路
对于这道题,要求实现一个可以返回当前栈中最小元素的栈。
第一种方法,是定义两个栈:
- 栈st:用来保存所有元素
- 栈minSt:用来保存当前的最小元素
因此,当push的元素比minSt栈顶元素要小时,则将该元素加入到minSt中。需要注意的是,因为push的元素可能和此时的最小是相等的,因此判断条件应该是小于等于。
当pop的元素和minSt的栈顶元素相同时,则st和minSt都要进行pop操作。
另一种方法则是使用一个栈,然后定义一个变量来记录此时栈内的最小值。这种方法实现同时记录新的最小值和旧的最小值的办法,则是在push操作对最小值进行更新时,同时把旧的最小值也压入栈中。这样,如果pop的元素等于此时的最小值,则进行两次pop操作,并将第二个pop的值赋值给最小值。、
3,代码实现
1,双栈法
class Solution {
public:
void push(int value) {
st.push(value);
if(minSt.empty() || value <= minSt.top())
minSt.push(value);
return;
}
void pop() {
if(st.top() == minSt.top())
minSt.pop();
st.pop();
return;
}
int top() {
return st.top();
}
int min() {
return minSt.top();
}
private:
stack<int> st;
stack<int> minSt;
};
2,单栈法
class Solution {
public:
void push(int value) {
if(value <= minVal){
st.push(minVal);
minVal = value;
}
st.push(value);
}
void pop() {
if(st.top() == minVal){
st.pop();
minVal = st.top();
}
st.pop();
}
int top() {
return st.top();
}
int min() {
return minVal;
}
private:
stack<int> st;
int minVal = INT_MAX;
};