《程序员代码面试指南》——设计一个有getMin功能的栈(Java实现)

题目:

    设计一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作

要求:

    pop、push、getMin操作的时间复杂度都是O(1)

思路:用两个栈,一个做正常的pop、push操作,另一个辅助栈用于存放每次操作后的最小值

Java实现:

import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        MyStack stack1 = new MyStack();
        stack1.push(3);
        stack1.push(2);
        stack1.push(1);
        //获取栈顶元素
        int stack = stack1.pop();
        //获取最小值
        int min = stack1.getMin();
        System.out.println(stack + " " + min + " ");

    }
}

class MyStack {
    //satckData用于存放所有的入栈元素
    private Stack<Integer> stackData;
    //stackMin作为辅助栈,用于存放最小值
    private Stack<Integer> stackMin;

    public MyStack(){
        this.stackData=new Stack<Integer>();
        this.stackMin=new Stack<Integer>();
    }

    //入栈
    public void push(int val){
        stackData.push(val);
        //如果stackMin为空或者当前插入的值小于等于stackMin的栈顶元素,就将新的值插入stackMin
        if(stackMin.empty()||val<=stackMin.peek())
            stackMin.push(val);
        //否则插入和当前stackMin栈顶元素一样的值
        else stackMin.push(stackMin.peek());
    }

    //出栈
    public int pop(){
        //先判空
        if(stackData.empty())
            throw new RuntimeException("Your stack is empty.");
        stackMin.pop();
        return stackData.pop();
    }

    //获取最小值,O(1)
    public int getMin(){
        if(stackMin.empty())
            throw new RuntimeException("Your stack is empty.");
        //stackMin的栈顶元素就是最小值
        return stackMin.peek();
    }
}

参考:《程序员代码面试指南》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值