剑指offer----包含min函数的栈

来源:互联网 发布:淘宝网充值 编辑:程序博客网 时间:2024/06/03 06:43
package offer;/** * 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 */import java.util.Stack;public class MinOfStack {    /*     * 定义两个栈,第一个栈用于存储存储数据的栈,记为data     *               第二个栈用于存储最小值     */    Stack<Integer> data = new Stack<Integer>();    Stack<Integer> min = new Stack<Integer>();    //定义一个变量用于存储最小值    Integer temp = null;    public void push(int node) {        //如果最小值为null,说明这是第一个元素进入栈中,直接将这个值赋值为最小值        //并压入最小值栈        if (temp == null) {            temp = node;            min.push(node);            //如果最小值不为0,说明这已经不是第一次将元素压入栈之中了        } else {            //如果压入的元素小于等于最小值            //这个if判断没有加else条件,这是因为无论如何都要讲元素压入存储数据的栈            //抽取到判断条件之外            if (node <= temp) {                //将该元素的值赋值给最小值                temp = node;                //将该元素压入最小值栈                min.push(node);            }        }        //将元素压入栈中        data.push(node);    }    //将栈之中的最顶端的元素移除    public void pop() {        if(data != null){                       //只需要移除data栈之中的最顶端的值就好            /*             * 但是这里有一种特殊情况需要考虑             * 如果我要移除的顶端的元素是最小的值呢?             * 如果我直接将data栈顶端的元素移除了             * 这时候min栈之中还是有保存这个元素的             * 所以需要对data,min栈同时进行pop操作             * 如果两个值不相等,就重新把min移除的元素push回去             */            int dataPop = data.pop();            int minPop = min.pop();            if(dataPop != minPop){                min.push(minPop);            }            //如果当前栈为null,抛出异常提示        }else{            throw new RuntimeException("栈为空");        }    }    //返回data最顶端的元素,并且不作移除操作    public int top() {        int topNum = data.pop();        //pop后,再push回去        data.push(topNum);        return topNum;    }    //返回data栈中的最小值,也就是返回min栈的栈顶    public int min() {        //同top一样,pop后再push回去        int minNum = min.pop();        min.push(minNum);        return minNum;    }}
0 0
原创粉丝点击