编程之美,实现MaxQueue

要求能在O(1)时间内取最大元素,并且放元素和取元素的时间复杂度尽量是O(1),之前有两个题是这个题的基础:

1、实现MaxStack(或者MinStack)。实现MaxStack比较简单,因为栈的操作都是在一端进行的。

2、用栈来实现队列。

这个题就是上述两个题的综合应用。首先要实现一个MaxStack,然后再用两个MaxStack来实现一个队列,两个MaxStack中的最大值就是队列中的最大值。

首先实现MaxStack:

import java.util.EmptyStackException;
import java.util.Stack;

/**
 * 鉴于实现MaxQueue需要MaxStack的支持,还是先实现一个MaxStack吧
 * @author qianlizhixingshiyuzuxia
 * @version 创建时间:2016年8月18日 下午11:11:11
 */
public class MaxStack {

	private Stack<Integer> commonStack = new Stack<Integer>();
	private Stack<Integer> maxStack = new Stack<Integer>();
	
	//MaxStack的push操作
	public MaxStack push(Integer x){
		commonStack.push(x);
		if(maxStack.isEmpty()){
			maxStack.push(x);
		}else{
			if(maxStack.peek()<x){
				maxStack.push(x);
			}else{
				maxStack.push(maxStack.peek());
			}
		}
		return this;
	}
	
	public int pop(){
		if(commonStack.isEmpty()){
			throw new EmptyStackException();
		}
		maxStack.pop();
		return commonStack.pop();
	}
	
	public int maxElement(){
		if(commonStack.isEmpty()){
			//throw new EmptyStackException();
			return -1;
		}
		return maxStack.peek();
	}
	
	public boolean isEmpty(){
		return commonStack.isEmpty();
	}
	
	//测试
	public static void main(String[] args) {
		MaxStack maxStack = new MaxStack();
		maxStack.push(2).push(1).push(3).push(4).push(3).push(2);
		System.out.println(maxStack);
	}

	@Override
	public String toString() {
		return "MaxStack [commonStack=" + commonStack + ", maxStack="
				+ maxStack + "]";
	}
}

然后用两个MaxStack实现MaxQueue:

/**
 * MaxQueue是指能在O(1)时间内取出最大值的queue,我们已经做过minStack或者maxStack。
 * 因为使用Stack保存最大值比较方便嘛,这里就用两个栈来实现一个队列,然后求最大值的时候
 * 就用返回这两个栈中的最大值
 * @author qianlizhixingshiyuzuxia
 * @version 创建时间:2016年8月18日 下午11:07:02
 */
public class MaxQueue {
	
	//第一个栈用于入队列,第二个栈用于出队列
	MaxStack s1 = new MaxStack();
	MaxStack s2 = new MaxStack();

	public MaxQueue enQueue(int x){
		s1.push(x);
		System.out.println(this.maxElement());
		return this;
	}

	public int deQueue(){
		System.out.println(this.maxElement());
		if(!s2.isEmpty()){
			return s2.pop();
		}
		
		while(!s1.isEmpty()){
			s2.push(s1.pop());
		}
		return s2.pop();
	}
	
	public int maxElement(){
		
		return Math.max(s1.maxElement(), s2.maxElement());
	}
	
	
	public static void main(String[] args) {
		MaxQueue maxQueue = new MaxQueue();
		maxQueue.enQueue(2).enQueue(3).enQueue(4).enQueue(1).enQueue(2);
		System.out.println("-------");
		maxQueue.deQueue();
		maxQueue.deQueue();
		maxQueue.deQueue();
		maxQueue.deQueue();
		maxQueue.deQueue();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值