普通栈的 push() 和 pop() 函数的复杂度为 O(1);而获取栈最小值 min() 函数需要遍历整个栈,复杂度为O(N) 。
现在要实现获取栈最小值 min() 函数,并使其复杂度为O(1)。
#include<iostream>
#include<stack>
using namespace std;
//实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
//使用一个辅助栈来实现这个需求。辅助栈的保持一个非严格递减的状态。
class MinStack{
//stack_a作为原始栈来存放数据
stack<int> stack_a;
//stack_b作为辅助栈用于存放一个非严格递减的序列,栈顶元素一直表示的是栈stack_a中的最小值
stack<int> stack_b;
public:
MinStack(){}
void push(int value){
stack_a.push(value);
//当stack_b为空,或者当前插入的值小于等于stack_b的栈顶元素时,将新元素插入至stack_b
if(stack_b.empty()||value<=stack_b.top()){
stack_b.push(value);
}
}
int pop(){
int value=stack_a.top();
stack_a.pop();
if(value==stack_b.top()){
stack_b.pop();
}
return value;
}
int get_min(){
return stack_b.top();
}
int top(){
return stack_a.top();
}
};
int main()
{
MinStack s;
s.push(-2);
s.push(0);
s.push(-3);
cout <<s.get_min()<< endl;
cout <<s.pop()<< endl;
cout <<s.top()<< endl;
cout <<s.get_min()<< endl;
return 0;
}