设计一个有getMin功能的栈

导读:本篇文章讲解 设计一个有getMin功能的栈,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

题目:实现一个特殊的栈,在实现栈的基本功能的基础上,在实现返回栈中最小元素的操作。

要求:

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

2. 设计的栈类型可以使用现成的栈结构

思路:

准备两个栈,一个为stackData(正常存取数据),一个为stackMin(用来存放小于栈顶元素的值)。

压栈:

stackData先压入,然后判断要压栈的数是否小于等于stackMin的栈顶元素,如果是,则stackMin也压入。

弹栈:

stackData先弹出,判断弹出值是否和stackMin的栈顶元素相等,如果是,则stackMin也弹出。

获取最小值:

直接返回stackMin栈顶元素。

public class Stack01 {

    private Stack<Integer> stackData;
    private Stack<Integer> stackMin;

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

    //压栈操作
    public void push(int number) {
        if (this.stackMin.isEmpty()) {
            this.stackMin.push(number);
        }else if (number <= this.getMin()) {
            this.stackMin.push(number);
        }
        this.stackData.push(number);
    }

    //弹栈操作
    public int pop() {
        if (this.stackData.isEmpty()) {
            throw new RuntimeException("栈为空");
        }
        int value = stackData.pop();
        if (value == this.getMin()) {
            this.stackMin.pop();
        }
        return value;
    }
    //获取最小值
    private int getMin() {
        if (this.stackMin.isEmpty()) {
            throw new RuntimeException("栈为空");
        }
        return this.stackMin.peek();
    }

    public static void main(String[] args) {
        Stack01 stack = new Stack01();
        stack.push(3);
        stack.push(4);
        stack.push(5);
        stack.push(1);
        stack.push(2);
        stack.push(1);

        System.out.println(stack.getMin());//预期结果 1

        stack.pop();
        stack.pop();
        stack.pop();
        System.out.println(stack.getMin());//预期结果 3
    }
}

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

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

(0)
小半的头像小半

相关推荐

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