美文网首页
算法题:实现最大(小)栈

算法题:实现最大(小)栈

作者: 戴继勇 | 来源:发表于2021-11-20 11:49 被阅读0次

##题目

实现一个最大(小)栈,即可随时拿出当前栈中最大(小)的元素

##解题思路

这是一道非常经典的面试题,目题目也不难,但还是很能考察开发人员的基本功的,所以面试官很容易脱口就问到这个题

这道题目的要求其实就是实现一个特殊的栈

这个栈能够随时拿到栈中所有元素的最大(小)值

这就是题目所有的要求了

所以在已有栈的基础上稍加改进就能实现

比较简单的办法就是使用两个栈来实现这个特殊的栈

其中一个栈stack正常进出元素

另外一个栈stackMax(stackMin)在进元素的时候,与栈顶的元素做一个比较

如果大于(小于)栈顶元素,则正常入栈

如果小于(大于)栈顶元素,则将当前栈顶的元素再次入栈

注意:当前元素栈顶并不出栈

出栈的时候就跟随stack正常出栈

这样就能保证stackMax(stackMin)跟stack的高度永远一致

并且栈顶的元素永远是最大(小)值

##算法图解

以最大栈为例进行图解演示

定义两个栈,和一堆需要入栈的元素

图片

当栈为空的时候,正常入栈

图片

当栈不为空的时候,stack栈正常入栈

stackMax栈中,则需要将入栈元素“3”与栈顶元素“1”进行比较

“3”>“1”,所以将“3”正常入栈

图片

stack栈仍然正常入栈

stackMax栈中,则需要将入栈元素“1”与栈顶元素“3”进行比较

“3”>“1”,所以将栈顶元素“3”,再次入栈

图片

依次类推,知道所有元素入栈

在这个过程中,stackMax栈的栈顶元素,始终是最大元素

图片 图片 图片 图片

##代码实现

public class MaxHeap {
    private final Stack<Integer> stack;
    private final Stack<Integer> stackMax;

    public MaxHeap() {
        this.stack = new Stack<>();
        this.stackMax = new Stack<>();
    }

    public Integer peekMax() {
        return stackMax.peek();
    }

    public Integer push(Integer item) {
        if (stack.isEmpty()) {
            stackMax.push(item);
        } else {
            if (item > stackMax.peek()) {
                stackMax.push(item);
            } else {
                stackMax.push(stackMax.peek());
            }
        }
        stack.push(item);
        return item;
    }

    public Integer peek() {
        return stack.peek();
    }

    public Integer pop() {
        stackMax.pop();
        return stack.pop();
    }
}

文/戴先生@2021年11月18日

---end---

相关文章

  • 算法题:实现最大(小)栈

    ##题目 实现一个最大(小)栈,即可随时拿出当前栈中最大(小)的元素 ##解题思路 这是一道非常经典的面试题,目题...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • 数据结构(二)——堆栈

    栈(stack)又名堆栈,它是一种运算受限的线性表。 栈分为两种——线性栈和链表栈,下面分别用两个算法题实现这两种...

  • 算法-栈和队列算法总结

    栈和队列算法总结 1 模拟 1.1 使用栈实现队列 1.2 使用队列实现栈 2 栈的应用 2.1 栈操作 2.2 ...

  • 96-不同的二叉搜索树-美丽的卡特兰数

    写在最前面 上题之前先写点前两天面试时面试官出的一道算法题的感想。他给的题目是实现一个栈,使得压栈、弹栈、求最小值...

  • leecode刷题(26)-- 用栈实现队列

    leecode刷题(26)-- 用栈实现队列 用栈实现队列 使用栈实现队列的下列操作: push(x) -- 将一...

  • 队列之-队列实现栈

    一、队列实现栈核心算法概述 之前已经描述过了用栈实现队列的功能,见栈系列之-实现队列,那么同样队列也可以用来实现栈...

  • 栈:平衡的字符串

    前段时间面试华为时,考官问了一道小算法题。 今天在看数据结构这本书时,想起了这道算法题。 其实就是使用栈这种数据结...

  • 手写算法题

    算法题 1.不用中间变量,用两种方法交换A和B的值? 2.求最大公约数? 3.模拟栈操作? 4.排序算法?(选择排...

  • Android面经| 算法题解

    整理了校招面试算法题,部分《剑指offer》算法题,以及LeetCode算法题,本博文中算法题均使用Java实现校...

网友评论

      本文标题:算法题:实现最大(小)栈

      本文链接:https://www.haomeiwen.com/subject/hjsdtrtx.html