首页 > 代码库 > 实现O(1)获取最大最小值的栈----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]; } }
实现O(1)获取最大最小值的栈----java
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。