java实现栈-输出最大值,最小值,时间复杂度O(1)

问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin函数。在该栈中,调用getMin、push及pop的时间复杂度都是O(1).

最小值思路:用一个辅助栈stack2记住每次入栈stack1的当前最小值:在stack1入栈时,往stack2中加入当前最小值;stack1元素出栈时,stack2也出栈一个元素。最小值从stack2中获取及栈顶元素。O(1)

最大值思路:同上O(1)

    package com.sheepmu;  

    import java.util.Arrays;  
    import java.util.Stack;  

    public class SpecialStack<E extends Comparable<E>>  
    {  
        Stack<E> stack1=new Stack<E>();  
        Stack<E> stackMin=new Stack<E>();//存放求最小值的栈  
        Stack<E> stackMax=new Stack<E>();//存放求最大值的栈  
        public void push(E e)  
        {  
            stack1.push(e);   

            if(stackMin.isEmpty()||e.compareTo(stackMin.peek())<0)  
                stackMin.push(e);//若最小栈为空push进stack时就同时把它push进stackMin;  
            else if(e.compareTo(stackMin.peek())>0)  
                stackMin.push(stackMin.peek());  

            if(stackMax.isEmpty()||e.compareTo(stackMin.peek())>0)  
                stackMax.push(e);  
            else if(e.compareTo(stackMax.peek())<0)  
                stackMin.push(stackMax.peek());  
        }  
        public E pop()//一定要记着,非空才能pop()  
        {  
            if(!stack1.isEmpty()&&!stackMin.isEmpty()&&!stackMax.isEmpty())  
            {     
                E e=stack1.pop();  
                stackMin.pop();  
                stackMax.pop();  
                return e;  
            }  
            else  
            {  
                System.out.println("栈已经为空了");  
                return null;  
            }  

        }  
        public E getMin()  
        {  
            return  stackMin.peek();  
        }  
        public E getMax()  
        {  
            return stackMax.peek();  
        }  
        public E getMed()  
        {  
            E[] ss=stack1.toArray(new E[stack.size()]);//stack1.toArray()返回的是Object[],  栈----->数组;不能toArray后再强制转换,会报错  
            Arrays.sort(ss);  
            return ss[ss.length/2];  
        }  

    }  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值