zoukankan      html  css  js  c++  java
  • 获取栈最小值,获取队列最小值

     求一个带有获取最小值的方法的栈:(这个栈里面可以有重复的数据)

    思路:

    设置一个变量,比较每次push的值,使变量一直是最小的,但是这个有个问题,当最小值对应的数据被pop以后,并不知道第二小的值,当然如果最小值是入栈的第一个元素的话,就没有任何问题

    下面的方法是, stack是用来存储数据的原有栈,minStack用来存储相对最小值的栈

    每当新元素进入stack时,比较新元素和stack当前最小值的大小,如果小于stack当前最小值,则让新元素的下标进入minStack,此时minStack的栈顶元素就是stack当前最小值的下标。

    Code:

    package com.qhong.dataStructures.demo1;
    
    import java.util.Stack;
    
    public class MinStackDemo {
        private Stack<Integer> stack = new Stack<Integer>();
        private Stack<Integer> minStack = new Stack<Integer>();
    
        public void push(int x) {
            stack.push(x);
            if (minStack.isEmpty() || x <= minStack.peek())
                minStack.push(x);
        }
    
        public void pop() {
            int value = stack.pop();
            if (value == minStack.peek())
                minStack.pop();
        }
    
        public int top() {
            return stack.peek();
        }
    
        public int getMin() {
            return minStack.peek();
        }
    
        public static void main(String[] args) {
            MinStackDemo stack = new MinStackDemo();
            stack.push(5);
            stack.push(4);
            stack.push(3);
            stack.push(6);
            stack.push(7);
            System.out.println(stack.getMin());
            stack.pop();
            stack.pop();
            stack.pop();
            System.out.println(stack.getMin());
        }
    }

    这个原理可以想象成stack内部由多个小的stack组成,每个切分的stack的最底层元素就是这个stack的最小值

    比如举例:

    Stack:5,6,4,3,6,7,2,9

    我们可以切分成 {5,6} {4},{3,6,7},{2,9}

    辅助的minStack内部存储的分别是切分的stack的最小值,即{5,4,3,2}

    然后依次进行消费,可以看出minStack里面由顶到底分别是最小,第二小,第三小。。。。。

    问题:

    如果是队列,求一个取出队列中最小值的方法

    其实跟上面对比,差不多,主要stack是先进后出,queue是先进先出

    按照我上面给的demo,那么一样,切分小的queue,存储到一个stack里面(必须存储到一个stack里面,不能存queue,最后存储的一定是最小的,所以必须后进先出)

    Demo:

    package com.qhong.dataStructures.demo1;
    
    
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Stack;
    
    public class MinQueueDemo {
        private Queue<Integer> queue = new LinkedList<Integer>();
        private Stack<Integer> minQueue = new Stack<Integer>();
    
        public void push(int x) {
            queue.offer(x);
            if (minQueue.isEmpty() || x <= minQueue.peek())
                minQueue.add(x);
        }
    
        public void pop() {
            int value = queue.poll();
            if (value == minQueue.peek())
                minQueue.pop();
        }
    
        public int top() {
            return queue.peek();
        }
    
        public int getMin() {
            return minQueue.peek();
        }
    
        public static void main(String[] args) {
            MinQueueDemo queue = new MinQueueDemo();
            queue.push(5);
            queue.push(4);
            queue.push(3);
            queue.push(6);
            queue.push(7);
            System.out.println(queue.getMin());
            queue.pop();
            queue.pop();
            queue.pop();
            System.out.println(queue.getMin());
        }
    }

    Output:

    3
    4
    View Code

    http://www.cnblogs.com/smyhvae/p/4795984.html

    http://blog.csdn.net/yangzhongblog/article/details/12391959

    http://www.cnblogs.com/smyhvae/p/4795984.html

    https://my.oschina.net/leejun2005/blog/135085

    http://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653190073&idx=1&sn=c20c002127e2ce3fe0c71a00aee70806&chksm=8c990563bbee8c75521c54ea8eb44b009ad07266b1e5fbf22926baf9a7b7302c7e4f7657dbb8&scene=21#wechat_redirect

  • 相关阅读:
    数据库(DB)
    PHP课程设计
    版本号设计规则
    设计模式(Java)
    简单的流式布局(移动应用开发)
    laravel工作机制(PHP程序设计)
    接口自动化测试(软件测试)
    Java学习路线
    ES6基础知识
    promise
  • 原文地址:https://www.cnblogs.com/hongdada/p/8359423.html
Copyright © 2011-2022 走看看