获取栈最小值,获取队列最小值

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

思路:

设置一个变量,比较每次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

posted @ 2018-01-26 14:40  hongdada  阅读(720)  评论(0编辑  收藏  举报