栈在o(1)时间获取最小元素

本文介绍两种实现带有获取最小值功能的栈的方法,确保push和pop操作的时间复杂度为O(1)。第一种方法使用两个栈分别存储数据和最小值;第二种方法通过每个元素记录当前最小值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pop,push里面都为o(1),这里只有时间复杂度的要求,但是没有空间复杂度的要求:

思路1:原来的栈里面只有一个数组,来存放所有的push值,现在,多一个用来存放最小值得栈,如果新进元素的值比最小值栈里面栈顶的元素要小,就push到最小值栈,其它情况不变。

思路2:将放数据的单独列出,放在一个类里面,每一个数据都知道最小值是什么。

思路一代码:

class StackOfMine{
 int[] elems=null;//数据放在这里
 int[] min=null;
 public StackOfMine(int k){
   elems=new int[k];
   min=new int[k];
 }
 int topOfStack=-1;
 int topOfMinStack=-1;
 public boolean isEmpty(){
   return topOfStack==-1;
 }
 public boolean isFull(){
  return topOfStack==elems.length;
 }
 public int getMin(){
  return getTopElem();
 }
 public int getTopElem(){
  return min[topOfMinStack];
 }
 public void push(int a){
  topOfStack++;
  if (!isFull()) {
  elems[topOfStack]=a;
  if (topOfStack==0) {
  topOfMinStack++;
  min[topOfMinStack]=a;
  }else{
  if (a<getTopElem()) {
  topOfMinStack++;
  min[topOfMinStack]=a;
  }
  }
  }else{
  throw new Error("wrong");
  }
 }
 public int pop(){
  int temp=elems[topOfStack];
  topOfStack--;
  if (temp==getTopElem()) {
  topOfMinStack--;
  }
  return temp;
 }
}

//思路2代码

class MyStack{
Elem[] a;//数据单独放在一个地方
public MyStack(int k){
a=new Elem[k];
for (int i=0;i<k ;i++ ) {
a[i]=new Elem();
}
}
int topOfStack=-1;
public void push(int b){
     topOfStack++;
     Elem temp=a[topOfStack];
     temp.setData(b);
     temp.setMin(topOfStack==0?b:(b>a[topOfStack-1].getMin()?a[topOfStack-1].getMin():b));
}
public int pop(){
int temp=a[topOfStack].getData();
topOfStack--;
return temp;
}
public int getMin(){
return a[topOfStack].getmin();
}
}
class Elem{
         private int data;
 private int min;
public void setData(int d){
data=d;
}
public void setMin(int m){
min=m;
}
public int getmin(){
return min;
}

       public int getData(){

              return data;

        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值