获取栈最小值,获取队列最小值
求一个带有获取最小值的方法的栈:(这个栈里面可以有重复的数据)
思路:
设置一个变量,比较每次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:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
3 4
http://www.cnblogs.com/smyhvae/p/4795984.html
http://blog.csdn.net/yangzhongblog/article/details/12391959
http://www.cnblogs.com/smyhvae/p/4795984.html