题目:设立最小栈
题目来源:https://leetcode.cn/leetbook/read/queue-stack/g5l7d/
题目内容:
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
- MinStack() 初始化堆栈对象。
- void push(int val) 将元素val推入堆栈。
- void pop() 删除堆栈顶部的元素。
- int top() 获取堆栈顶部的元素。
- int getMin() 获取堆栈中的最小元素。
C++代码实现:方法一
使用单栈,存储数据值x与最小值的差值diff。
class MinStack {
private:
stack<long> st;
long _min;
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
if (!st.empty()) {
long long diff = x - _min;
_min = diff > 0 ? _min : x;
st.push(diff);
}
else {
_min = x;
st.push(0);
}
//cout << min_data.back() << endl;
}
void pop() {
if (!st.empty()) {
long long diff = st.top();
st.pop();
if (diff < 0) {
_min = int (_min - diff);
}
}
}
int top() {
return st.top() < 0 ? _min : int(st.top() + _min);
}
int getMin() {
return _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();
*/
C++代码实现:方法二
使用双栈,一个栈存储数据值,一个栈存储最小值。
#include<stack>
class MinStack {
private:
std::stack<int> data_stack;
std::stack<int> min_stack;
public:
MinStack() {}
void push(const int &val) {
if(data_stack.empty()||val<=min_stack.top())
min_stack.push(val);
data_stack.push(val);
}
void pop() {
if(data_stack.top()==min_stack.top())
min_stack.pop();
data_stack.pop();
}
int top() {
return data_stack.top();
}
int getMin() {
return min_stack.top();
}
};