* LinkedList로 만들면 큐는 상당히 간단하다

* 하지만 배열로 만들면 조.금 까다롭다.

* Java API 로 구현된 Queue를 확인해보면 Array, LinkedList 로 구현된 구현체들이 존재한다.

* 하지만 나는 복잡한건 좋아하지 않으므로 LinkedList로 구현


컨테이너 클래스
package algo.queue;

public class MyQueue<E> {

	private MyQueueNode<E> front;
	private MyQueueNode<E> rear;
	private int size;

	public E enqueue(E item) {
		
		MyQueueNode<E> newNode = new MyQueueNode<>(item);
		
		if(front == null) {
			front = rear = newNode;
		}else {
			
			rear.setNext(newNode);
			rear = newNode;
		}
		
		size++;
		
		return item;
	}

	public E dequeue() {
		
		if(isEmpty())
			return null;
		
		E item = front.getItem();
		
		if (front == rear)
			front = rear = null;
		else
			front = front.getNext();
		
		size--;
		
		return item;
	}

	public E peek() {
		
		if(isEmpty())
			return null;
		
		return front.getItem();
		
	}

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

	public int getSize() {
		return size;
	}
	
	@Override
	public String toString() {

		StringBuilder builder = new StringBuilder();

		if(front != null)
			builder.append("FRONT : " + front + "\nREAR  : " + rear + "\n");
		
		MyQueueNode<E> search = front;
		while (search != null) {
			builder.append(search.toString());
			builder.append("\n");
			search = search.getNext();
		}

		builder.append("total size = " + size);
		builder.append("\n-----------------------\n");

		return builder.toString();
	}	

}

Node 클래스
package algo.queue;

public class MyQueueNode<E> {

	private E item;
	private MyQueueNode<E> next;
	
	public MyQueueNode(E item) {
		this.item = item;
	}

	public E getItem() {
		return item;
	}

	public MyQueueNode<E> getNext() {
		return next;
	}

	public void setNext(MyQueueNode<E> next) {
		this.next = next;
	}

	
	@Override
	public String toString() {
		String nextItem = next != null ? next.getItem().toString() : null;
		return String.format("MyQueueNode [item=%s, next=%s]", item, nextItem);
	}
	
}

테스트
import algo.queue.MyQueue;

public class Main {

	public static void main(String[] args) {
		
		MyQueue<String> queue = new MyQueue<>();
		System.out.println(queue);
		
		queue.enqueue("1");
		System.out.println(queue);
		
		queue.enqueue("2");
		queue.enqueue("3");
		System.out.println(queue);
		
		System.out.println("* PEEK : " + queue.peek());
		System.out.println(queue);
		
		System.out.println("* DEQUE : " + queue.dequeue());
		System.out.println(queue);
		
		System.out.println("* DEQUE : " + queue.dequeue());
		System.out.println(queue);
		
		System.out.println("* DEQUE : " + queue.dequeue());
		System.out.println(queue);
		
	}
}

<결과>

total size = 0
-----------------------

FRONT : MyQueueNode [item=1, next=null]
REAR  : MyQueueNode [item=1, next=null]
MyQueueNode [item=1, next=null]
total size = 1
-----------------------

FRONT : MyQueueNode [item=1, next=2]
REAR  : MyQueueNode [item=3, next=null]
MyQueueNode [item=1, next=2]
MyQueueNode [item=2, next=3]
MyQueueNode [item=3, next=null]
total size = 3
-----------------------

* PEEK : 1
FRONT : MyQueueNode [item=1, next=2]
REAR  : MyQueueNode [item=3, next=null]
MyQueueNode [item=1, next=2]
MyQueueNode [item=2, next=3]
MyQueueNode [item=3, next=null]
total size = 3
-----------------------

* DEQUE : 1
FRONT : MyQueueNode [item=2, next=3]
REAR  : MyQueueNode [item=3, next=null]
MyQueueNode [item=2, next=3]
MyQueueNode [item=3, next=null]
total size = 2
-----------------------

* DEQUE : 2
FRONT : MyQueueNode [item=3, next=null]
REAR  : MyQueueNode [item=3, next=null]
MyQueueNode [item=3, next=null]
total size = 1
-----------------------

* DEQUE : 3
total size = 0
-----------------------



'Data Structure - Using java' 카테고리의 다른 글

Stack - Created as Array  (0) 2018.05.24
Doubly Linked List  (0) 2018.05.23
Linked List  (0) 2018.05.22

+ Recent posts