zoukankan      html  css  js  c++  java
  • 实现O(1)获取最大最小值的栈----java

                                    实现O(1)获取最大最小值的栈和队列----java

    一.怎样实现包括获取最小值函数的栈

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

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

    最大值思路:同上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];
    	}
        
    }
    


  • 相关阅读:
    xrange和range区别
    bool([x]) 将x转换为Boolean类型
    bin(x) 将整数x转换为二进制字符串
    chr(i) 返回整数i对应的ASCII字符
    音乐欣赏
    迅雷下载百度云引发的“事故”
    swift获取图片路径出错
    记号笔写在白板上引起的尴尬而又无奈的事件
    swift 3新特性总结
    watch
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6939611.html
Copyright © 2011-2022 走看看