#include<iostream>
#include<stack>
using namespace std;
class StackAddMin{
public:
stack <int> datas;
stack <int> minStack;
public:
void Newpush(int data);
void Newpop();
int min();
int Newtop();
};
void StackAddMin::Newpush(int data)
{
datas.push(data);
if(minStack.empty()||data<minStack.top())
{
minStack.push(data);
}
}
void StackAddMin::Newpop()
{
if(datas.top()<minStack.top())
{
minStack.pop();
}
datas.pop();
}
int StackAddMin::Newtop()
{
return datas.top();
}
int StackAddMin::min()
{
return minStack.top();
}
int main()
{
StackAddMin *s=new StackAddMin();
s->Newpush(5);
s->Newpush(3);
s->Newpush(4);
s->Newpush(1);
s->Newpop();
cout<<s->min()<<endl;
return 0;
}
算法思想:借鉴了大牛的算法,向大牛们学习
即是借助辅助栈,保存最小值,
且随时更新辅助栈中的元素。
如先后,push 2 6 4 1 5
stack A stack B(辅助栈)
4: 5 1 //push 5,min=p->[3]=1 ^
3: 1 1 //push 1,min=p->[3]=1 | //此刻push进A的元素1小于B中栈顶元素2
2: 4 2 //push 4,min=p->[0]=2 |
1: 6 2 //push 6,min=p->[0]=2 |
0: 2 2 //push 2,min=p->[0]=2 |
push第一个元素进A,也把它push进B,
当向Apush的元素比B中的元素小, 则也push进B,即更新B。否则,不动B,保存原值。
向栈A push元素时,顺序由下至上。
辅助栈B中,始终保存着最小的元素。
然后,pop栈A中元素,5 1 4 6 2
A B ->更新
4: 5 1 1 //pop 5,min=p->[3]=1 |
3: 1 1 2 //pop 1,min=p->[0]=2 |
2: 4 2 2 //pop 4,min=p->[0]=2 |
1: 6 2 2 //pop 6,min=p->[0]=2 |
0: 2 2 NULL //pop 2,min=NULL v
当pop A中的元素小于B中栈顶元素时,则也要pop B中栈顶元素。
算法的时间复杂度O(n)。