1. 程式人生 > >雙棧佇列實現快速獲取佇列最大值最小值

雙棧佇列實現快速獲取佇列最大值最小值

含有記錄棧的陣列棧實現,兩個記錄棧,一個記錄最大值,一個記錄最小值。

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());
		}
	}
}