点击链接即可查看题目:155. 最小栈 - 力扣(LeetCode)
一、题目
设计一个支持
push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。实现
MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。示例 1:
输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,null,null,null,-3,null,0,-2] 解释: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.提示:
-231 <= val <= 231 - 1
pop
、top
和getMin
操作总是在 非空栈 上调用push
,pop
,top
, andgetMin
最多被调用3 * 104
次
二、解题思路以及代码
* 1. 利用两个栈,一个为正常栈(保存所有的进出栈数据),一个为最小栈(只有当数据为最小时,才会入栈)
* 2. 核心在于:入栈时,若数据最小,需要两个栈都要入栈,出栈时,如果出的数据为最小,需要更新最小栈
class MinStack {
public:
MinStack()
{}
void push(int val)
{
st.push(val);
if(minst.empty() || val < minst.top().val )
{
conut_data c_val;
c_val.count = 1;
c_val.val = val;
minst.push(c_val);
}
else if(minst.top().val == val)
{
++minst.top().count;
}
}
void pop()
{
if(st.top() == minst.top().val)
{
if(minst.top().count == 1)
{
minst.pop();
}
else
{
--minst.top().count;
}
}
st.pop();
}
int top()
{
return st.top();
}
int getMin()
{
return minst.top().val;
}
struct conut_data
{
int count;
int val;
};
stack<int> st;
stack<conut_data> minst;
};