我是靠谱客的博主 大气书包,最近开发中收集的这篇文章主要介绍设计一个有getMin功能的栈-Java:解法二,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net

package live.every.day.ProgrammingDesign.CodingInterviewGuide.StackAndQueue;

import java.util.Stack;

/**
 * 设计一个有getMin功能的栈
 *
 * 【题目】
 * 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
 *
 * 【要求】
 * 1、push、pop、getMin操作的时间复杂度都是O(1)。
 * 2、设计的栈类型可以使用现成的栈结构。
 *
 * 【难度】
 * 简单
 *
 * 【解答】
 * 在设计上我们使用两个栈,一个栈用来保存当前栈中的元素,其功能和一个正常的栈没有区别,记为dataStack;另一个栈用于保存
 * 每一步的最小值,记为minStack。具体的实现方式有两种。
 *
 * 第二种设计方案如下。
 *
 * 压入数据规则:
 * 假设当前数据为num,先将其压入dataStack。然后判断minStack是否为空:
 * 如果为空,则num也压入minStack;
 * 如果不为空,则比较num和minStack的栈顶元素中哪一个更小:如果num更小或两者相等,则num也压入minStack;如果minStack中
 * 栈顶元素小,则把minStack的栈顶元素重复压入minStack,即在栈顶元素上再压入一个栈顶元素。
 *
 * 弹出数据规则:
 * 在dataStack中弹出数据,弹出的数据记为value;弹出minStack中的栈顶;返回value。
 * 很明显可以看出,压入与弹出规则是对应的。
 *
 * 查询当前栈中的最小值:
 * 由上文的压入数据规则和弹出数据规则可知,minStack始终记录着dataStack中的最小值,所以minStack的栈顶元素始终是当前
 * dataStack中的最小值。
 *
 * 方案二的代码实现如StackWithGetMin2类所示:
 *
 * 【点评】
 * 方案一和方案二其实都是用minStack栈保存着dataStack每一步的最小值。共同点是所有操作的时间复杂度都为O(1)、空间复杂度
 * 都为O(n)。区别是:方案一中minStack压入时稍省空间,但是弹出操作稍费时间;方案二中minStack压入时稍费空间,但是弹出操
 * 作稍省时间。
 *
 * @author Created by LiveEveryDay
 */

public class StackWithGetMin2 {

    private final Stack<Integer> dataStack;
    private final Stack<Integer> minStack;

    public StackWithGetMin2() {
        this.dataStack = new Stack<>();
        this.minStack = new Stack<>();
    }

    public void push(int num) {
        this.dataStack.push(num);
        if (this.minStack.isEmpty()) {
            this.minStack.push(num);
        } else if (num < this.getMin()) {
            this.minStack.push(num);
        } else {
            int min = this.minStack.peek();
            this.minStack.push(min);
        }
    }

    public int pop() {
        if (this.dataStack.isEmpty()) {
            throw new RuntimeException("Stack is empty.");
        }
        this.minStack.pop();
        return this.dataStack.pop();
    }

    public int getMin() {
        if (this.minStack.isEmpty()) {
            throw new RuntimeException("Stack is empty.");
        }
        return this.minStack.peek();
    }

    public static void main(String[] args) {
        StackWithGetMin2 stack = new StackWithGetMin2();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(2);
        stack.pop();
        System.out.printf("The min element in stack is: %d%n", stack.getMin());
    }

}

// ------ Output ------
/*
The min element in stack is: 1
*/

最后

以上就是大气书包为你收集整理的设计一个有getMin功能的栈-Java:解法二的全部内容,希望文章能够帮你解决设计一个有getMin功能的栈-Java:解法二所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部