题目描述
设计一个支持 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.
参考代码
int g_invalidInput = false;
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int value) {
data.push(value);
if(minInData.empty() || value < minInData.top())
minInData.push(value);
else
minInData.push(minInData.top());
}
void pop() {
if(!data.empty() && !minInData.empty()){
data.pop();
minInData.pop();
}
}
int top() {
if(!data.empty())
return data.top();
g_invalidInput = true;
return -1;
}
int getMin() {
if(!minInData.empty())
return minInData.top();
g_invalidInput = true;
return -1;
}
private:
stack<int> data;
stack<int> minInData;
};
/**
* 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();
*/
拓展:队列的最大值
// 滑动窗口最大值的变形,《剑指offer》上的解法可以,但下面的解法更简洁。(维护一个递减的双端队列deque)
class MaxQueue {
public:
MaxQueue() {
// nothing
}
int max_value() {
if(dq.empty())
return -1;
return dq.front();
}
void push_back(int value) {
q.push(value);
while(!dq.empty() && value > dq.back()) // 这里用大于等于号也行,同上。
dq.pop_back();
dq.push_back(value);
}
int pop_front() {
if(q.empty())
return -1;
int res = q.front();
q.pop();
if(!dq.empty() && res == dq.front())
dq.pop_front();
return res;
}
private:
queue<int> q;
deque<int> dq;
};