包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

栈的特点是先进后出,所以要求min的时间复杂度是1,就必须将最小的元素时刻放在栈顶,那么我们考虑每次压栈的时候,将当前要压栈的元素和栈中所有元素进行比较,最小的放在栈顶。这样是可以满足min函数的要求,但是这个数据结构就不是栈了,因为不能保证先进后出。

那么我们考虑在栈中设置一个变量保存最小的元素,但是,加入我们将最小的元素出栈,那么第二小的元素是什么呢?就不知道了。

所以考虑,用一个辅助栈去存储最小的元素。
假如我们将3、4、2、1进行入栈操作。

首先,入栈3:
这里写图片描述
主栈和辅助栈都是空,直接入栈。

入栈4,4不是最小的,所以主栈入栈4,而辅助栈入栈3,始终保持栈顶元素最小,并且两个栈的元素个数相等。
这里写图片描述

入栈2,主栈直接压栈,辅助栈2是最小的,放在最顶层:
这里写图片描述

同理可得1入栈的结果如下图所示:
这里写图片描述

那么我们来看看min函数,在这个函数中,我们调用stack的peek()函数,这个函数的作用是读取栈顶的元素,而不做其他改变。

而进行pop()操作的时候,主栈和辅助栈都必须进行pop操作。

综上分析,代码如下:

import java.util.Stack;

public class Solution {

    // 创建主栈和辅助栈
    Stack <Integer> mainStack = new Stack<Integer>();
    Stack <Integer> helpStack = new Stack<Integer>();

    public void push(int node) {
        if((mainStack.isEmpty() && helpStack.isEmpty()) || node <= helpStack.peek()){
            helpStack.push(node);
        }else{
            helpStack.push(helpStack.peek());
        }
         mainStack.push(node);
    }

    public void pop() {
        // 出栈的时候,主栈和辅助栈都要出栈
        mainStack.pop();
        helpStack.pop();
    }


    public int top() {
        return mainStack.peek();
    }

    public int min() {
        return helpStack.peek();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值