Queue实现

来源:互联网 发布:淘宝客最低佣金是多少 编辑:程序博客网 时间:2024/06/05 01:17

队列接口

public interface Queue<E> {/** * 将元素e插入队列 */void enqueue(E e);/** * 返回并移除列头元素 */E dequeue();/** * 返回队列头的元素 */E getFront();/** * 判断队列是否为空 */boolean isEmpty();/** * 清空队列 */void makeEmpty();}

链表队列

import java.util.NoSuchElementException;public class Queue_Linked<E> implements Queue<E> {public Queue_Linked(){this.back  = this.front = null;}@Overridepublic void enqueue(E e) {if(isEmpty()){back = front = new Node<E>(e);} else {back = back.next = new Node<E>(e);}}@Overridepublic E dequeue() {if(isEmpty()){throw new EmptyQueueException();}E oldValue = front.value;front = front.next;return oldValue;}@Overridepublic E getFront() {if(isEmpty()){throw new NoSuchElementException();}return this.front.value;}@Overridepublic boolean isEmpty() {return front == null;}@Overridepublic void makeEmpty() {this.front = null;this.back = null;}private Node<E> front;private Node<E> back;private static class Node<E> {Node<E> next ;E value;public Node(E value){this(value, null);}public Node(E value, Node<E> next){this.value = value;this.next = next;}}}

顺序表队列

import java.util.Arrays;public class Queue_Array<E> implements Queue<E>{@SuppressWarnings("unchecked")public Queue_Array(){this.array = (E[]) new Object[DEFAULT_SIZE];makeEmpty();}@Overridepublic void enqueue(E e) {ensureCapacity(currentSize++);back = increment(back);array[back] = e;}@Overridepublic E dequeue() {if(isEmpty()){throw new EmptyQueueException();}E value = array[front];front = increment(front);currentSize--;return value;}private int increment(int x) {if(++x == array.length){x =0 ;}return x;}@Overridepublic E getFront() {if(isEmpty()){throw new EmptyQueueException();}return array[front];}@Overridepublic boolean isEmpty() {return currentSize == 0;}@Overridepublic void makeEmpty() {front = 0;back =-1;currentSize = 0;}private void ensureCapacity(int newLength) {if (newLength == array.length) {array = Arrays.copyOf(array, array.length * 2);}}private E[] array;private int currentSize;private int front;private int back;private static int DEFAULT_SIZE = 10;}


Unit Test

由于Queue_Linked和Queue_Array都实现了Queue接口,所以对于两者的Unit Test几乎一样。

import static org.junit.Assert.*;import org.junit.Test;public class Queue_LinkedTest {@Testpublic void testEnqueue() {Queue<Integer> q = new Queue_Linked<Integer>();q.enqueue(1);q.enqueue(2);q.enqueue(3);q.enqueue(4);q.enqueue(5);q.enqueue(6);int i = 1;while(!q.isEmpty()){int actuals = q.dequeue();assertEquals(i, actuals);i++;}}@Testpublic void testDequeue() {Queue<Integer> q = new Queue_Linked<Integer>();q.enqueue(1);q.enqueue(2);q.enqueue(3);q.enqueue(4);q.enqueue(5);q.enqueue(6);while(!q.isEmpty()){q.dequeue();}boolean expected  = true;assertEquals(expected, q.isEmpty());}@Testpublic void testGetFront() {Queue<Integer> q = new Queue_Linked<Integer>();q.enqueue(1);q.enqueue(2);q.enqueue(3);q.enqueue(4);q.enqueue(5);q.enqueue(6);int expected  = 1;assertEquals(expected, q.getFront().intValue());}@Testpublic void testIsEmpty() {Queue<Integer> q = new Queue_Linked<Integer>();boolean expected = true;assertEquals(expected, q.isEmpty());}@Testpublic void testMakeEmpty() {Queue<Integer> q = new Queue_Linked<Integer>();q.enqueue(1);q.enqueue(2);q.enqueue(3);q.enqueue(4);q.enqueue(5);q.enqueue(6);q.makeEmpty();boolean expected = true;assertEquals(expected, q.isEmpty());}}


原创粉丝点击