Week 2 編程作業:Deques and Randomized Queues

編程作業: Deques and Randomized Queues

Deque使用節點,RandomizedQueue使用陣列,100分沒有太困難

Deque.java

import java.util.Iterator;

public class Deque<Item> implements Iterable<Item> {

	private final Node head;
	private final Node tail;
	private int size;

	public Deque() {
		this.head = new Node();
		this.tail = new Node();
		this.head.next = this.tail;
		this.tail.pre = this.head;
	}

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

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

	public void addFirst(Item item) {
		checkNullItem(item);
		Node newNode = new Node(item);
		insertAfter(this.head, newNode);
	}

	public void addLast(Item item) {
		checkNullItem(item);
		Node newNode = new Node(item);
		insertAfter(this.tail.pre, newNode);
	}

	private void insertAfter(Node a, Node insert) {
		this.size++;
		Node b = a.next;
		insert.next = b;
		insert.pre = a;
		a.next = insert;
		b.pre = insert;
	}

	private static void checkNullItem(Object item) {
		if (item == null)
			throw new java.lang.IllegalArgumentException();
	}

	public Item removeFirst() {
		if (this.size == 0)
			throw new java.util.NoSuchElementException();

		return remove(this.head.next);
	}

	public Item removeLast() {
		if (this.size == 0)
			throw new java.util.NoSuchElementException();

		return remove(this.tail.pre);
	}

	private Item remove(Node n) {
		this.size--;
		Node a = n.pre;
		Node b = n.next;
		n.next = null;
		n.pre = null;
		a.next = b;
		b.pre = a;
		return n.item;
	}

	public Iterator<Item> iterator() {
		return new DequeIterator();
	}

	private class DequeIterator implements Iterator<Item> {

		private Node cur = head;

		@Override
		public boolean hasNext() {
			return cur.next != tail;
		}

		@Override
		public Item next() {
			if (!this.hasNext())
				throw new java.util.NoSuchElementException();

			cur = cur.next;
			return cur.item;
		}

	}

	private class Node {
		Item item;
		Node next;
		Node pre;

		Node() {
		}

		Node(Item item) {
			this.item = item;
		}
	}

	public static void main(String[] args) {
		Deque<Integer> dq = new Deque<>();

		dq.addFirst(1);
		dq.addFirst(2);
		dq.addLast(3);

		System.out.println(dq.removeLast());
		System.out.println(dq.removeLast());
		System.out.println(dq.removeLast());

	}

}

RandomizedQueue.java

import java.util.Iterator;

import edu.princeton.cs.algs4.StdRandom;

public class RandomizedQueue<Item> implements Iterable<Item> {

	private static final int MIN_SIZE = 16;
	private Item[] ar;
	private int size;

	public RandomizedQueue() {
		this.ar = (Item[]) new Object[MIN_SIZE];
	}

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

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

	public void enqueue(Item item) {
		if (item == null)
			throw new java.lang.IllegalArgumentException();
		sizeup();
		this.ar[size++] = item;
	}

	public Item dequeue() {
		if (this.size == 0)
			throw new java.util.NoSuchElementException();

		int i = StdRandom.uniform(0, size);
		Item rtn = this.ar[i];
		this.ar[i] = this.ar[size - 1];
		this.ar[size - 1] = null;
		size--;
		sizedown();
		return rtn;
	}

	private void sizeup() {
		if (this.size < this.ar.length)
			return;

		Item[] newar = (Item[]) new Object[this.ar.length * 2];
		System.arraycopy(this.ar, 0, newar, 0, this.size);
		this.ar = newar;
	}

	private void sizedown() {
		if (this.ar.length == MIN_SIZE || this.size >= this.ar.length / 4)
			return;

		Item[] newar = (Item[]) new Object[this.ar.length / 2];
		System.arraycopy(this.ar, 0, newar, 0, this.size);
		this.ar = newar;
	}

	public Item sample() {
		if (this.size == 0)
			throw new java.util.NoSuchElementException();

		int i = StdRandom.uniform(0, size);
		return this.ar[i];
	}

	public Iterator<Item> iterator() {
		return new RQIterator();
	}

	private class RQIterator implements Iterator<Item> {

		private final int[] is = StdRandom.permutation(size);
		private int i = 0;

		@Override
		public boolean hasNext() {
			return i < size;
		}

		@Override
		public Item next() {
			if (!this.hasNext())
				throw new java.util.NoSuchElementException();

			return ar[is[i++]];
		}

	}

	public static void main(String[] args) {
		RandomizedQueue<Integer> rq = new RandomizedQueue<>();

		for (int i = 0; i < 50; i++)
			rq.enqueue(i);

		for (int i : rq)
			System.out.println(i);

		System.out.println("========");
		for (int i = 0; i < 50; i++)
			System.out.println(rq.dequeue());

	}

}

Permutation.java

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

public class Permutation {

	public static void main(String[] args) {
		int k = Integer.parseInt(args[0]);
//		int k = 3;

		RandomizedQueue<String> rq = new RandomizedQueue<>();

		while(!StdIn.isEmpty()) {
			String s = StdIn.readString();
			rq.enqueue(s);
		}
		
		for (int i = 0; i < k; i++)
			StdOut.println(rq.dequeue());

	}

}