实现加入了min的stack的源代码

#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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值