java 实现一个最小栈


最小栈

1.实现思路

  • 实现一个stack栈 和 minStack栈。
  • 先将数据一个一个压入到 stack 中。
  • 找到 stack 中的最小值。
  • minStack中始终要压入当前最小的值。

2.实现过程演示

1、先将元素压入到 stack 中,若当前的 minStack 中没有元素。则当前的元素为最小值。



2、将最小压入到 minStack 中。



3、压入3和0这两个数据,0成为了当前的最小值。



4、将当前最小值0压入到 minStack 中



5、继续压入9,当前的最小值还是0。



6、此时压入 -9 ,-9为此时最小值,将它压入minStack中



7、如果此时压入到stack中的值等于当前最小的值,也要压入到minStack中
在这里插入图片描述


总结:

如果要存放的值为x,minStack的栈顶元素为y。

  • x < y 时,要压入元素到minStack中。
  • x == y 时,要压入元素到minStack中。
  • x > y 时,不需要压入,

3.代码实现思路

3.1 压入思路

  1. 先实现两个栈,一个是普通栈,一个是最小栈。
 stack = new Stack<>();
 minStack = new Stack<>();
  1. 往stack中压入一个元素。
 stack.push(val);
  1. 若此时minStack为空,就将 stack 中元素压入到minStack中。
 if (minStack.empty()) {
     minStack.push(val);
 }
  1. 若不为空就比较一下,将当前最小值压入到minStack中。
int stackTop = stack.peek();
if (val <= stackTop) {
    minStack.push(val);
}

3.2 弹出思路

  1. stack不能是空的,若是空的就不能弹出。
 if (!stack.empty()) {
 }
  1. 若当前stack不为空,弹出stack栈顶元素,定义一个变量接收。
 int stackX = stack.pop();
  1. 如果stack栈顶的值等于minStack的栈顶的值就弹出minStack栈栈顶的元素
if (stackX == minStack.peek()) {
    minStack.pop();
}

3.3 如何返回栈顶元素的下标

  1. 前提是栈不为空 - 直接用peek返回
if (!stack.empty()) {
    return stack.peek();
}
  1. 若栈是空的,直接返回-1表示栈为空。
return -1;

3.4 如何返回栈的最小值

  1. 因为此时栈顶会一直是最小值,所以直接返回栈顶元素即可
 return minStack.peek();
  1. 前提是栈不为空,若此时栈为空,就直接返回-1表示此时栈为空。
return -1;

4.整体代码实现

public class MinStack {
    private Stack<Integer> stack;
    private Stack<Integer> minStack;

    public void minStack() {
        stack = new Stack<>();
        minStack = new Stack<>();

    }

    public void push(int val) {
        stack.push(val);//给stack压入一个值
        //最小栈为空
        if (minStack.empty()) {
            minStack.push(val);//压入到最小栈
        }else {
            //比较大小
            int stackTop = stack.peek();//看一下栈顶元素的值
            if (val <= stackTop) {
                //将这个栈顶元素压入到minStack中
                minStack.push(val);
            }
        }
    }

    public void pop() {
        if (!stack.empty()) {
            int stackX = stack.pop();//压入到stackX中
            //如果stack的栈顶的值等于最小栈的栈顶的值
            if (stackX == minStack.peek()) {
                //弹出
                minStack.pop();
            }
        }
    }

    public int top() {
        //不为空
        if (!stack.empty()) {
            //返回栈顶位置的下标
            return stack.peek();
        }
        return -1;
    }

    public int getMin() {
        if (minStack.empty()) {
            return -1;
        }
        //不为空返回栈顶的下标 - 栈顶会一直放最小值
        return minStack.peek();
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与大师约会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值