实现O获取最大最小值的栈----java

Posted lxjshuju

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现O获取最大最小值的栈----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];
	}
    
}





以上是关于实现O获取最大最小值的栈----java的主要内容,如果未能解决你的问题,请参考以下文章

左神算法之获取栈中最小值

设计一个有getMin功能的栈

单调队列与单调栈作用

1.给栈添加一个获取最小值的方法(元素为Integer型),要求时间复杂度为O

python实现时间o的最小栈

左神算法书籍《程序员代码面试指南》——1_01设计一个有getMin功能的栈