您的位置:首页 > 编程语言 > Java开发

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

2018-03-15 17:31 2026 查看
问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的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];
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐