算法案例(2)———-实现一个具有getMin功能的栈

导读:本篇文章讲解 算法案例(2)———-实现一个具有getMin功能的栈,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

零、简介

  • 记录 左程云 大神的  程序员代码面试指南 一书里面的算法实现。
  • 代码路径: https://github.com/1956025812/algorithm 
  • 2020年开始每周一道算法,成就自己的算法之路~

一、题目

  • 题目: 实现一个具有getMin功能的栈。
  • 要求: pop、push、getMin的时间复杂度都是o(1)。可以使用现有的栈结构。

二、实现思路

  • 内部定义另一个临时栈,始终存放最小值即可。
  • push数据的时候,与临时栈栈顶元素比较,如果小于或等于,则同步push到临时栈的栈顶;
  • pop数据的时候,与临时栈栈顶元素比较,如果一样,则同步将临时栈的数据pop出来;
  • getMin功能,临时栈的栈顶元素始终都是最小值,一个pop操作的复杂度就是o(1);

三、案例

3.1 代码

package day20200101;

import java.util.Stack;

/**
 * 题目:  设计一个有getMin功能的栈
 * 要求:
 * 1. pop、push、getMin的时间复杂度都是o(1)
 * 2. 设计的栈类型可以使用现成的栈结构
 * <p>
 * 思路:
 * 构造一个临时的栈,用来存放最小的数据。
 * push数据的时候与临时栈的栈顶元素做比较,如果小于或等于,就放到临时栈。注意: 小于和等于都要放。
 * pop数据的时候与临时栈的栈顶元素做比较,如果一样,则同步pop
 */
public class MyMinStack {

    private Stack<Integer> dataStack;
    private Stack<Integer> tempStack;

    public MyMinStack() {
        this.dataStack = new Stack<>();
        this.tempStack = new Stack<>();
    }

    /**
     * push方法
     *
     * @param data 新数据
     */
    public void push(Integer data) {
        dataStack.push(data);

        if (tempStack.isEmpty()) {
            tempStack.push(data);
        } else {
            if (data <= tempStack.peek()) {
                tempStack.push(data);
            }
        }
    }


    /**
     * pop方法
     *
     * @return 栈顶元素
     */
    public Integer pop() {
        if (dataStack.isEmpty()) {
            throw new RuntimeException("当前栈dataStata没有数据");
        }

        // 如果要pop的元素正好是最小元素,则要同时一起将临时栈的元素pop
        Integer popData = dataStack.peek();
        if (popData.equals(tempStack.peek())) {
            tempStack.pop();
        }

        return dataStack.pop();
    }


    /**
     * getMin方法
     *
     * @return 栈的最小元素
     */
    public Integer getMin() {
        if (tempStack.isEmpty()) {
            throw new RuntimeException("当前栈dataStata没有数据");
        }
        return tempStack.pop();
    }


    public static void main(String[] args) {
        MyMinStack myMinStack = new MyMinStack();
        myMinStack.push(3);
        myMinStack.push(2);
        myMinStack.push(3);
        myMinStack.push(6);
        myMinStack.push(1);
        System.out.println(myMinStack.getMin());
        myMinStack.pop();
        System.out.println(myMinStack.getMin());
    }
}



3.2 测试

1
2

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/17694.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!