题目
请你设计一个 最小栈 。它提供 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],[2],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,2,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(2);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 2.
minStack.getMin(); --> 返回 -2.
提示:
-231 <= val <= 231 - 1
pop
、top
和getMin
操作总是在 非空栈 上调用push
、pop
、top
和getMin
最多被调用3 * 104
次
分析
栈是先入后出的结构,因此实际上可以每次计算当时的最小值,然后也用栈来保存,这样的话读取的时候不需要重新计算最小值,就能做到常数时间内检索到最小值。
代码
#include <stack>
class MinStack {
public:
/** initialize your data structure here. */
MinStack()
{
}
void push(int x)
{
m_s.push(x);
if (!m_min.size() || x < m_min.top()) {
m_min.push(x);
} else {
m_min.push(m_min.top());
}
}
void pop()
{
m_s.pop();
m_min.pop();
}
int top()
{
return m_s.top();
}
int getMin()
{
return m_min.top();
}
private:
std::stack<int> m_s;
std::stack<int> m_min;
};
/**
* 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();
*/
#ifdef __TEST__
#include <iostream>
int main(int argc, char* argv[])
{
MinStack* minStack = new MinStack();
minStack->push(-2);
minStack->push(2);
minStack->push(-3);
int ret = minStack->getMin(); //--> 返回 -3.
std::cout << "get min: -3 == " << ret << "\n";
minStack->pop();
ret = minStack->top(); //--> 返回 2.
std::cout << "top: 2 == " << ret << "\n";
ret = minStack->getMin(); //--> 返回 -2
std::cout << "min: -2 == " << ret << "\n";
delete minStack;
return 0;
}
#endif //__TEST__