Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

배열기반 큐 구현 예제 코드 작성 #26

Merged
merged 9 commits into from
Aug 4, 2020
2 changes: 0 additions & 2 deletions .idea/.gitignore

This file was deleted.

5 changes: 2 additions & 3 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions yoonexample/src/main/java/exception/EmptyQueueException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package exception;

public class EmptyQueueException extends RuntimeException {

public EmptyQueueException() {
super("Queue is Emtpy.");
}
}
62 changes: 62 additions & 0 deletions yoonexample/src/main/java/queue/ArrayQueue.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package queue;

import exception.EmptyQueueException;

public class ArrayQueue<E> implements Queue<E> {

private static final int INITIAL_CAPACITY = 100;

private int front;
private int rear;
private int size;
private Object[] queueArray;

public ArrayQueue() {
queueArray = new Object[INITIAL_CAPACITY];
}

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

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

@Override
public void enqueue(E data) {
if (nextIndex(this.rear) == this.front) { // 큐가 꽉 찬 경우(this.size == 100).
return;
}

this.rear = nextIndex(this.rear);
queueArray[this.rear] = data;
this.size++;
}

@Override
public E dequeue() {
if (isEmpty()) {
throw new EmptyQueueException();
}

this.front = nextIndex(this.front);
this.size--;
return (E) queueArray[this.front];
}

@Override
public E peek() {
if (isEmpty()) {
throw new EmptyQueueException();
}

return (E) queueArray[nextIndex(this.front)];
}

private int nextIndex(int pos) {
return pos == INITIAL_CAPACITY - 1 ? 0 : pos + 1;
}
}
45 changes: 45 additions & 0 deletions yoonexample/src/main/java/queue/Queue.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package queue;

/**
* Queue 자료구조의 ADT, 인터페이스
*
* @param <E> 데이터의 파라미터 타입
* @author dion
*/
public interface Queue<E> {

/**
* 큐에 저장된 데이터의 개수를 반환합니다.
*
* @return 데이터의 개수
*/
int size();

/**
* 큐가 비어있는지 여부를 반환합니다.
*
* @return 큐가 비어있으면 true, 그렇지 않으면 false
*/
boolean isEmpty();

/**
* 큐에 파라미터로 전달된 데이터를 마지막에 저장합니다.
*
* @param data 저장할 데이터
*/
void enqueue(E data);

/**
* 큐의 처음에 위치한 데이터를 꺼냅니다. 이 함수를 호출하기 위해서는 데이터가 하나 이상 있음이 보장되어야 합니다.
*
* @return 처음에 위치했던 데이터
*/
E dequeue();

/**
* 큐의 처음에 위치한 데이터를 확인합니다. 이 함수를 호출하기 위해서는 데이터가 하나 이상 있음이 보장되어야 합니다.
*
* @return 처음에 위치한 데이터
*/
E peek();
}
81 changes: 81 additions & 0 deletions yoonexample/src/test/java/queue/QueueTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package queue;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import exception.EmptyQueueException;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

class QueueTest {

@Test
@DisplayName("배열_기반_큐_생성_테스트")
void 배열_기반_큐_생성_테스트() {
Queue<Integer> queue = new ArrayQueue<>();

assertThat(queue).isNotNull();
assertThat(queue.isEmpty()).isTrue();
assertThat(queue.size()).isEqualTo(0);
}

@Test
@DisplayName("배열_기반_큐_생성_테스트")
void 배열_기반_큐_EmptyQueueException_테스트() {
Queue<Integer> queue = new ArrayQueue<>();

assertThat(queue).isNotNull();
assertThat(queue.isEmpty()).isTrue();
assertThat(queue.size()).isEqualTo(0);
assertThatThrownBy(queue::dequeue).isInstanceOf(EmptyQueueException.class);
assertThatThrownBy(queue::peek).isInstanceOf(EmptyQueueException.class);
}

@Test
@DisplayName("배열_기반_큐_데이터_저장_테스트")
void 배열_기반_큐_데이터_저장_테스트() {
Queue<Integer> queue = new ArrayQueue<>();

queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);
queue.enqueue(5);

assertThat(queue).isNotNull();
assertThat(queue.isEmpty()).isFalse();
assertThat(queue.size()).isEqualTo(5);
}

@Test
@DisplayName("배열_기반_큐_데이터_저장_후_제거_테스트")
void 배열_기반_큐_데이터_저장_후_제거_테스트() {
Queue<Integer> queue = new ArrayQueue<>();

queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);
queue.enqueue(5);

assertThat(queue).isNotNull();
assertThat(queue.isEmpty()).isFalse();
assertThat(queue.size()).isEqualTo(5);
assertThat(queue.peek()).isEqualTo(1);
assertThat(queue.dequeue()).isEqualTo(1);
assertThat(queue.size()).isEqualTo(4);
assertThat(queue.peek()).isEqualTo(2);
assertThat(queue.dequeue()).isEqualTo(2);
assertThat(queue.size()).isEqualTo(3);
assertThat(queue.peek()).isEqualTo(3);
assertThat(queue.dequeue()).isEqualTo(3);
assertThat(queue.size()).isEqualTo(2);
assertThat(queue.peek()).isEqualTo(4);
assertThat(queue.dequeue()).isEqualTo(4);
assertThat(queue.size()).isEqualTo(1);
assertThat(queue.peek()).isEqualTo(5);
assertThat(queue.dequeue()).isEqualTo(5);
assertThat(queue.isEmpty()).isTrue();
assertThat(queue.size()).isEqualTo(0);
}
}