剑指:包含min函数的栈(min栈)

题目描述

设计一个支持 push,pop,top 等操作并且可以在 O(1) 时间内检索出最小元素的堆栈。

  • push(x)–将元素x插入栈中
  • pop()–移除栈顶元素
  • top()–得到栈顶元素
  • getMin()–得到栈中最小元素

样例

MinStack minStack = new MinStack();
minStack.push(-1);
minStack.push(3);
minStack.push(-4);
minStack.getMin();   --> Returns -4.
minStack.pop();
minStack.top();      --> Returns 3.
minStack.getMin();   --> Returns -1.

解法

定义两个stack,一个为存放最小数的序列的辅助栈

压栈时,先将元素 x 压入 stack1。然后判断 stack2 的情况:

  • stack2 栈为空或者栈顶元素大于 x,则将 x 压入 stack2 中。
  • stack2 栈不为空且栈定元素小于 x,则重复压入栈顶元素。

获取最小元素时,从 stack2 中获取栈顶元素即可。

import java.util.Stack;

public class MinStack {
    private Stack<Integer> stack1;
    private Stack<Integer> stack2;

    public MinStack(){
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }

    public void push(int x){
        stack1.push(x);
        if(stack2.isEmpty() || stack2.peek()>x)
            stack2.push(x);
        else
            stack2.push(stack2.peek());
    }

    public void pop(){
        stack1.pop();
        stack2.pop();
    }

    public int top(){
        return stack1.peek();
    }

    public int getMin(){
        return stack2.peek();
    }
}

public static void main(String[] args) {
    MinStack obj = new MinStack();
    obj.push(-1);
    obj.push(3);
    obj.push(-4);
    obj.push(0);
    obj.pop();
    int param_3 = obj.top();
    int param_4 = obj.getMin();
    System.out.println(param_3+ " "+param_4);
}

原文地址:https://www.cnblogs.com/lisen10/p/11188561.html

时间: 2024-10-01 21:56:05

剑指:包含min函数的栈(min栈)的相关文章

剑指offer-面试题7:俩个栈实现队列(java)

详细分析请参照C语言版,这里仅仅给出实现代码,注释很详细,不得不说java各种api用起来真是爽飞了 1 package com.xsf.SordForOffer; 2 3 import java.util.Stack; 4 5 /** 6 * 剑指offer pro7,俩个链表实现一个队列 7 * @author ELVIS 8 */ 9 class ListQueue{ 10 //定义俩个栈 11 private Stack<String> stack1 = new Stack<St

剑指offer6&amp;7&amp;8&amp;9-链表&amp;树&amp;栈

题目6 输入一个链表的头节点,从尾到头反过来打印出每个结点的值 思路 1.使用递归.逆序打印a->b->c->d,可以先逆序打印b->c->d(看成新的链表),再打印a:那么同样逆序可以先逆序打印c->d,再打印b:直到打印到尾节点. 2.使用栈.栈具有后进先出的特点,刚好符合逆序要求.遍历链表时将值按顺序放入栈中,最后依次出栈. 解法 class ListNode{ int m_nKey; ListNode m_pNext; } //递归法 public void P

《剑指offer》之用两个栈实现队列

题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:把stack1作为主栈,每次有新元素入队,先把stack1中所有元素pop到stack2中暂存,再push新元素到stack1,最后把stack2中元素pop到stack1. 代码实现: 1 import java.util.Stack; 2 3 public class Solution { 4 Stack<Integer> stack1 = new Stack<Integer&g

剑指offer五之用两个栈实现队列

一.题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 二.思路 1.Push操作:将数据直接压入stack1即可 2.Pop操作:将stack1中的数据全部弹出压入到stack2中,然后将stack1中的数据全部弹出即可 注意:要将stack1中的数据全部压入到stack2中后,才能将stack2中的数据弹出 三.代码 1.解决方法 import java.util.Stack; public class Solution { Stack<Integer

剑指offer(五):用两个栈实现一个队列

题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接往第一个添加即可 ②在删除时分情况, 第一:如果stack2不为空,则直接弹出stack2中的元素即可,因为stack2中的肯定要比stack1中的元素加进来早 第二:如果stack2是空的,则把stack1中的元素一一弹出并加入到stack2中,之后再弹出 如图测试数据:(结合下面代码看) 1 i

【剑指Offer】05 - 用两个栈实现队列

重建二叉树 时间限制:1秒 空间限制:32768K 本题知识点:队列 栈 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. import java.util.Stack; public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); publi

剑指offer(PHP版改写)---两个栈实现队列

$arr1 = array();$arr2 = array(); function push($node){ global $arr1; array_push($arr1,$node);} function pop(){ global $arr1; global $arr2; if (!empty($arr2)){ return array_pop($arr2); }else{ while (!empty($arr1)){ array_push($arr2,array_pop($arr1));

剑指Offer对答如流系列 - 包含min函数的栈

面试题30:包含min函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 问题分析 push 和 pop均容易实现. 主要就是min函数的定义,如果要通过操作push和pop操作获取最小元素时间复杂度为O(1),基本上是不可能的. 如果我们另外定义一个成员变量 专门存储最小元素的值,但是当最小元素弹出后,min就需要相应改变,所以必须把每次的最小值都存储下来.这个时候不得不考虑采用一个辅助栈

【算法题目】包含min函数的栈

题目来源:<剑指offer>面试题21 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push以及pop的时间复杂度都是O(1). 分析:假设用于存储主要数据的栈称为数据栈.我们增加一个辅助栈,它的栈顶元素永远是当前数据栈中元素的最小值.当插入元素时,如果插入的元素比辅助栈栈顶还小,那么就往辅助栈压入这个数据作为当前数据栈新的最小值.如果大的话,再次压入辅助栈的栈顶元素,表明来了一个新元素后,最小值没有变换. //m_data是数据栈,m_

微软100题系列之-----设计包含min函数的栈

题意: 定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素. 要求函数min.push 以及pop 的时间复杂度都是O(1). 思路:定义两个栈,一个用来记录数据的插入和删除,一个用来存储最小值的变化 代码如下: template <class T> class Stack { public: Stack(int len=100); T Min(); T Pop(); void Push(T val); private: T top1,top2; T *stack1,*stack