实现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=(E[])stack1.toArray();//stack1.toArray()返回的是Object[],  栈----->数组
		Arrays.sort(ss);
		return ss[ss.length/2];
	}

}

实现O(1)获取最大最小值的栈----java,布布扣,bubuko.com

时间: 2024-10-05 04:41:15

实现O(1)获取最大最小值的栈----java的相关文章

JavaScript获取数组最小值和最大值的方法

本文实例讲述了JavaScript获取数组最小值和最大值的方法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 var arr = new Array(); arr[0] = 100; arr[1] = 0; arr[2] = 50; var min = Math.min.apply(null, arr),  max = Math.max.apply(null, arr); 以下是补充: ? 1 2 3 var a=[1,2,3,5]; alert(Math.max.apply(n

getCurrentPages() 获取到当前页面栈

1.getCurrentPages()是以最近的tab页面为基准,虽然AppData中可能有多个tab页面,只以最近的一个为基准 pay页面中,跳转到get-score页面 wx.redirectTo({ url: '/pages/get-score/get-score', success: res => { console.log(getCurrentPages()) } }) 2.redirectTo(), navigateTo() 方法中,getCurrentPages()获取到的页面栈中

13.1-全栈Java笔记:打飞机游戏实战项目|AWT技术|MyGameFrame

简介和项目目标 通过游戏项目学习整个Java基础知识体系,我们做了精心的设计,让每一章知识都能获得应用. 比如:多线程用来实现动画效果.容器实现对于多发炮弹的存取和处理.常用类等等的应用. 寓教于乐,让大家迅速入门,更希望通过喜闻乐见的小游戏,让大家爱上编程,爱上"程序员". 老鸟建议 很多朋友会疑惑:"游戏项目,又不能拿到企业面试中,为什么要讲?" 这是一种太过于功利的想法.就像,我们说:"今天吃个馒头,又不是长高,为什么要吃呢?" 游戏项目的

12.7-全栈Java笔记:Java网络编程(五)

UDP通讯的实现 1.DatagramSocket:用于发送或接收数据包 当服务器要向客户端发送数据时,需要在服务器端产生一个DatagramSocket对象,在客户端产生一个DatagramSocket对象.服务器端的DatagramSocket将DatagramPacket发送到网络上,然后被客户端的DatagramSocket接收. DatagramSocket有两种构造函数.一种是无需任何参数的,常用于客户端.另一种需要指定端口,常用于服务器. 常用方法:send.receive. cl

12.3-全栈Java笔记:Java网络编程(一)

Java为了可移植性,不允许直接调用操作系统,而是由java.net包来提供网络功能.Java虚拟机负责提供与操作系统的实际连接.  InetAddress 作用:封装计算机的IP地址和DNS(没有端口信息!). 特点:这个类没有构造函数.如果要得到对象,只能通过静态方法:getLocalHost.getByName. getAllByName. getAddress.getHostName. [示例1]使用getLocalHost方法创建InetAddress对象 InetAddress ad

13.9-全栈Java笔记:打飞机游戏实战项目|Time|Plane|其他案例展示

其他功能 完成了基本的功能,这时候体验度还是很一般.为了让玩家更愿意玩我们的游戏,增加一些锦上添花的功能就很有必要.比如:游戏计时功能.全网排名等等.  计时功能 我们希望在玩游戏时,增加计时功能,可以清晰的看到自己玩了多长时间,增加刺激性.这个功能的核心有两点: 1. 时间计算:当前时刻- 游戏结束的时刻 2. 显示时间到窗口 时间计算 我们在初始化窗口时,就保存一个起始时间:当飞机死亡时,保存一个结束时间.我们在MyGameFrame中定义两个成员变量,如示例1所示. [示例1]定义时间变量

10.1-全栈Java笔记:最全面的IO技术(一)

IO技术 对于任何程序设计语言而言,输入输出(Input/Output)系统都是非常核心的功能.程序运行需要数据,数据的获取往往需要跟外部系统进行通信,外部系统可能是文件.数据库.其他程序.网络.IO设备等等. 外部系统比较复杂多变,那么我们有必要通过某种手段进行抽象.屏蔽外部的差异,从而实现更加便捷的编程. 输入(Input)指的是:可以让程序从外部系统获得数据(核心含义是"读",读取外部数据).常见的应用: 1) 读取硬盘上的文件内容到程序.例如:播放器打开一个视频文件.word打

9.9-全栈Java笔记:遍历集合的N种方式总结&Collections工具类

遍历集合的N种方式总结 [示例1]遍历List方法1,使用普通for循环 for(int i=0;i<list.size();i++){         //list为集合的对象名 String temp = (String)list.get(i); System.out.println(temp); } [示例2]遍历List方法2,使用增强for循环(使用泛型定义类型!) for (String   temp : list) { System.out.println(temp); } [示例

11.5-全栈Java笔记:线程基本信息和优先级别

获取线程基本信息的方法 表  线程的常用方法 方法 功能 isAlive() 判断线程是否还"活"着,即线程是否还未终止. getPriority() 获得线程的优先级数值 setPriority() 设置线程的优先级数值 setName() 给线程一个名字 getName() 取得线程的名字 currentThread() 取得当前正在运行的线程对象,也就是取得自己本身 [示例1]线程的常用方法举例一 public class ThreadTest3 { public static