双栈队列实现快速获取队列最大值最小值

本文介绍了如何利用两个数组栈,一个记录最大值,一个记录最小值,来实现一个特殊队列。该队列能够在常数时间内获取当前队列的最大值和最小值,提供了一种高效的数据结构解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

含有记录栈的数组栈实现,两个记录栈,一个记录最大值,一个记录最小值。

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

public class MaxStack<E extends Comparable<E>> {

	private List<E> stack;
	private List<E> maxStack;
	private List<E> minStack;

	public MaxStack() {
		stack = new ArrayList<E>();
		maxStack = new ArrayList<E>();
		minStack = new ArrayList<E>();
	}

	public int size() {
		return stack.size();
	}

	public boolean isEmpty() {
		return stack.size() == 0;
	}

	public E push(E e) {
		if (e == null)
			return null;

		int count = stack.size();
		if (count == 0) {
			stack.add(e);
			maxStack.add(e);
			minStack.add(e);
			return e;
		}

		stack.add(e);
		if (maxStack.get(count - 1).compareTo(e) > 0)
			maxStack.add(maxStack.get(count - 1));
		else
			maxStack.add(e);

		if (minStack.get(count - 1).compareTo(e) < 0)
			minStack.add(minStack.get(count - 1));
		else
			minStack.add(e);

		return e;
	}

	public E pop() {
		if (stack.size() == 0)
			return null;

		maxStack.remove(stack.size() - 1);
		minStack.remove(stack.size() - 1);

		return stack.remove(stack.size() - 1);
	}

	public E peek() {
		return stack.size() == 0 ? null : stack.get(stack.size() - 1);
	}

	public E getMaxE() {
		return stack.size() == 0 ? null : maxStack.get(stack.size() - 1);
	}

	public E getMinE() {
		return stack.size() == 0 ? null : minStack.get(stack.size() - 1);
	}

	@Override
	public String toString() {
		StringBuffer sBuffer = new StringBuffer("STACK");
		StringBuffer aBuffer = new StringBuffer("MAX");
		StringBuffer iBuffer = new StringBuffer("MIN");
		for (int i = 0; i < stack.size(); i++) {
			sBuffer.append("|" + stack.get(i));
			aBuffer.append("|" + maxStack.get(i));
			iBuffer.append("|" + minStack.get(i));
		}
		sBuffer.append("\n" + aBuffer + "\n" + iBuffer + "\n");
		return sBuffer.toString();
	}

	public static void main(String[] arg) {
		MaxStack<Integer> maxStack = new MaxStack<Integer>();
		Random random = new Random(new Date().getTime());
		int cur = 0;
		for (int i = 0; i < 15; i++) {
			cur = random.nextInt(20);
			if (cur % 4 != 0)
				maxStack.push(cur);
			else
				maxStack.pop();
			System.out.println(maxStack);
		}
	}
}

使用上述记录栈实现的可以快速获取队列最值的队列

import java.util.Date;
import java.util.Random;

public class MaxQueue<E extends Comparable<E>> {

	private MaxStack<E> inStack;
	private MaxStack<E> outStack;

	public MaxQueue() {
		inStack = new MaxStack<E>();
		outStack = new MaxStack<E>();
	}

	public boolean isEmpty() {
		return inStack.isEmpty() && outStack.isEmpty();
	}

	public int size() {
		return inStack.size() + outStack.size();
	}

	public E getMaxE() {
		E in = inStack.getMaxE();
		E out = outStack.getMaxE();
		if (in == null && out == null)
			return null;
		if (in == null)
			return out;
		if (out == null)
			return in;
		return in.compareTo(out) > 0 ? in : out;
	}

	public E getMinE() {
		E in = inStack.getMinE();
		E out = outStack.getMinE();
		if (in == null && out == null)
			return null;
		if (in == null)
			return out;
		if (out == null)
			return in;
		return in.compareTo(out) < 0 ? in : out;
	}

	private void moveFromInToOut() {
		while (inStack.size() != 0)
			outStack.push(inStack.pop());
	}

	public E peek() {
		if (outStack.size() == 0 && inStack.size() == 0)
			return null;
		if (outStack.size() == 0)
			moveFromInToOut();
		return outStack.peek();
	}

	public E deQueue() {
		if (outStack.size() == 0 && inStack.size() == 0)
			return null;
		if (outStack.size() == 0)
			moveFromInToOut();
		return outStack.pop();
	}

	public E enQueue(E e) {
		return inStack.push(e);
	}

	public static void main(String[] arg) {
		MaxQueue<Integer> maxQueue = new MaxQueue<Integer>();
		Random random = new Random(new Date().getTime());
		int cur = 0;
		for (int i = 0; i < 15; i++) {
			cur = random.nextInt(20);
			if (cur % 4 != 0)
				System.out.print(maxQueue.enQueue(cur) + "<-");
			else
				System.out.print("<-" + maxQueue.deQueue());

			System.out.println("|Max:" + maxQueue.getMaxE() + "Min|:"
					+ maxQueue.getMinE());
		}
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值