[b.d]--算法题-求含有min函数的栈的实现

来源:互联网 发布:java get post 编辑:程序博客网 时间:2024/04/27 16:02

带有min函数的栈

1. 空间复杂度是O(n)

这种情况没什么好说的,利用一个同等大的辅助栈,如果入栈数据的数据比辅助栈辅助栈栈顶数据小,就更新辅助栈数据,如果大于或则等于辅助栈的栈顶,就直接吧辅助栈的栈顶复制一次再入辅助栈就行了。

这种方法比较简单,没什么说的,也不给出实现了,百度一大堆。

2. 空间复杂度的优化版本

前面的一种解法,存在大量的重复元素被插入辅助栈,辅助栈是可以进行优化的。下面给出优化算法:

(1)每次入栈时进行判断,如果辅助栈为null,就直接把元素入栈;

(2)如果辅助栈非空,判断入栈元素是否大于辅助栈栈顶,大于就啥也不干,否则就把元素入辅助栈(这里包括入栈元素小于或则等于辅助栈栈顶)

(3)出栈的时候,如果数据栈是最后一个元素,辅助栈肯定同步出栈。 如果出栈数据等于辅助栈顶元素,辅助栈就出栈。

下面给出是实现代码:

package algorithm.baidu;import java.util.Stack;/** * Created by louyuting on 2017/2/27. * Question: 带min函数的栈 的 辅助栈的优化 */public class MinStack2 {    public static Stack<Integer> stack = new Stack<Integer>();    public static Stack<Integer> stack2 = new Stack<Integer>();    //入栈优化    public static void push(Integer num){        stack.push(num);//元素入数据栈        if(stack2.isEmpty()){            stack2.push(num);        }else {            //1. 如果入栈数据num比辅助栈的栈顶的数据大, 辅助栈就不必入栈,避免内存浪费            if(num > stack2.lastElement()) {                //            }            else{//2. 如果入栈数据num比辅助栈的栈顶的数据小或则等于, 辅助栈就入栈,                stack2.push(num);            }        }    }    //出栈    public static Integer pop(){        int result = stack.pop();        //如果栈中是最后一个元素了,辅助栈肯定要同步出栈        if(stack.size()==1)            stack2.pop();//删除辅助栈的栈顶        else {            //出栈数据等于出栈后的栈顶数据, 辅助栈出站            if(result == stack2.lastElement()) {                stack2.pop();            } else if(result > stack2.lastElement()){                //不管            }        }        return result;    }    //获取最小值    public static Integer min(){        return stack2.lastElement();    }    public static void main(String[] args) {        MinStack2.push(1);        MinStack2.push(0);        MinStack2.push(1);        MinStack2.push(0);        MinStack2.push(1);        MinStack2.push(0);        MinStack2.push(1);        while (!stack.isEmpty()) {            System.out.println("current max : " + MinStack2.min());            MinStack2.pop();        }    }}

我测试的没有bug, 如果有好友测试出BUG,欢迎留言。

0 0