1 题目分析
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
思路
定义两个栈,一个用来存储数据,另一个用来维护最小值。在存入数据时,比较新数据是否为栈目前的最小值,若是则存入另一个栈。弹出数据时,比较数据是否为栈目前的最小值,若是则也从另一个栈弹出。另一个栈的栈顶始终为最小值。
2 代码实现
定义Minstack类与数据成员stk,stk_min
class MinStack {
public:
MinStack() { }
stack <int> stk, stk_min
}
定义push函数:
- 当stk为空时,执行一次push函数,stk_min也会将当前数据存入
- stk不为空时,执行一次push函数,stk_min会比较当前数据是否小于或等于栈顶,若是则存入栈顶,保证栈顶始终为stk的最小值
void push(int val) {
if (stk.empty())
{
stk_min.push(val);
}
else
{
if (val <= stk_min.top())
{
stk_min.push(val);
}
}
stk.push(val);
}
定义pop函数:
- 当stk栈顶数据等于stk_min栈顶数据时,也要弹出stk_min的栈顶
void pop() {
if (stk.top()==stk_min.top())
{
stk_min.pop();
}
stk.pop();
}
top函数和get_min函数
int top() {
return(stk.top());
}
int getMin() {
return stk_min.top();
}
结果