设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) – 将元素 x 推入栈中。
- pop() – 删除栈顶的元素。
- top() – 获取栈顶元素。
- getMin() – 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————————————
解题思路:这里引用作者陈乐乐的解题方法。
解法一:一个栈sum存放数据,另一个栈min存放前栈中最小的数据;
class MinStack {
public:
/** initialize your data structure here. */
stack<int> sum; # 用于存放数据
stack<int> min; # 用于存放当前栈中最小的数据
MinStack() {
} #构造函数,用于初始化类变量,这里不做任何操作
void push(int x) { # 将数据压入栈中
if(min.empty()||min.top()>=x) # 如果存放栈最小数据的栈为空,或者存放最小数据的栈的top值大于等于要压进栈中的值,则将当前值x压进栈min中。这里之所以是选择>=而不是>,是因为当存在压入操作(0,1,0)时,可以将两个零都压进去
min.push(x);
sum.push(x); # 将当前值压进栈sum中
}
void pop() { # 栈的弹出操作
if(sum.top()==min.top()) # 如果栈sum中当前弹出的值是栈min中top的值,则将栈min中的top值进行弹出
min.pop();
sum.pop();
}
int top() { # 当前栈的top值,直接查询栈sum中的top值
return sum.top();
}
int getMin() { # 查询栈中的最小值,直接返回栈min的top值,因为只有当栈min中的top值小于输入的x值的时候,才会将x值压进栈min中,所以栈min中的top值必定是栈sum中的最小值
return min.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(x);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/