반응형
큐는 FIFO(First In First Out) 형태의 자료구조로 먼저 들어간 데이터가 먼저 빠져나가는 것이다.
실생활에서 이와 비슷한 내용은 버스 줄서기로 먼저 줄을 선 사람이 먼저 버스를 탄다.
이를 구현하는 방법은 여러가지 방법이 있는데, 여기서는 데이터 구조를 원형처럼 생각해서 구현하는 방법을 이용하였다. 디버그의 편의성을 위해서 총 4개의 파일로 분할해서 만들었다.
첫 번째는 배열의 크기가 0이면 에러를 발생시키게 하는 파일 소스이다.
public class EQException extends Exception{ public EQException(){ super("The queue is empty!"); } }
두 번째는 interface로 Queue에 필요한 메서드를 선언하는 파일 소스이다.
public interface Queue<E> { public void enqueue(E element); public E front() throws EQException; public E dequeue() throws EQException; public boolean isEmpty(); public int size(); }
세 번째는 앞에서 선언한 메서드에 대한 body부분을 작성하는 파일 소스이다.
public class QueueArray<E> implements Queue<E> { private E[] data; private int size, front, back; static final int DEFAULT_CAPACITY = 2; public QueueArray(){ data = (E[]) new Object[DEFAULT_CAPACITY]; size = 0; front = 0; back = -1; } public boolean isEmpty(){ return (size==0); } private int increment(int i){ return ((i+1)%data.length); } public void enqueue(E element){ if(size==data.length){ expandArray(2); } back = increment(back); data[back] = element; size++; } public E dequeue() throws EQException { if(isEmpty()) { throw new EQException(); } size--; E returnValue = data[front]; front = increment(front); return returnValue; } public E front() throws EQException{ if(isEmpty()){ throw new EQException(); } return data[front]; } public int size(){ return size; } private void expandArray(int n){ System.out.println("Expanding array..."); E[] newArray = (E[])new Object[n*data.length]; if(front <= back){ for(int i = front; i<= back; i++){ newArray[i-front] = data[i]; } } else { int i; for(i=front; i<data.length; i++){ newArray[i-front] = data[i]; } for(int j=0; j<=back; j++,i++){ newArray[i-front] = data[j]; } } data = newArray; front = 0; back = front + size - 1; } public String toString(){ if(size==0){ return "[]"; } String result = "[ "; if(front <= back) { for(int i = front; i<=back; i++){ result += i + ":" + data[i] + ", "; } } else { for(int i = front; i<data.length; i++){ result += i + ":" + data[i] + ", "; } for(int i = 0; i<=back;i++){ result += i + ":" + data[i] + ", "; } } result = result.substring(0, result.length()-2); result += " ]"; return result; } }
마지막은 main 함수로 앞에서 선언한 Queue가 제대로 작동하는지 확인하는 내용이다. 이 부분은 직접 선언해서 함수들이 잘 작동하는지 확인해본다.
반응형
'컴퓨터 > Java' 카테고리의 다른 글
MongoDB에서 Between 쿼리 사용하기 (0) | 2024.04.23 |
---|---|
도서 바코드 데이터 추출 알고리즘 (2) | 2016.01.27 |
2048 ver 1.1 (0) | 2014.06.04 |
Fibonacci number (0) | 2014.06.04 |
2048 ver 1.0 (0) | 2014.06.04 |