Skip to content

Commit 0444d5f

Browse files
authored
Merge pull request #27 from Data-Structure-Study/yoonexample
연결리스트 기반 큐 작성
2 parents 944e101 + 0c6615e commit 0444d5f

File tree

3 files changed

+199
-0
lines changed

3 files changed

+199
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package deque;
2+
3+
/**
4+
* Deque 자료구조의 ADT, 인터페이스
5+
*
6+
* @param <E> 데이터의 파라미터 타입
7+
* @author dion
8+
*/
9+
public interface Deque<E> {
10+
11+
/**
12+
* 덱에 저장된 데이터의 개수를 반환합니다.
13+
*
14+
* @return 데이터의 개수
15+
*/
16+
int size();
17+
18+
/**
19+
* 덱이 비어있는지 여부를 반환합니다.
20+
*
21+
* @return 덱이 비어있으면 true, 그렇지 않으면 false
22+
*/
23+
boolean isEmpty();
24+
25+
/**
26+
* 덱의 앞부분에 데이터를 추가합니다.
27+
*
28+
* @param data 저장할 데이터
29+
*/
30+
void addFirst(E data);
31+
32+
/**
33+
* 덱의 뒷부분에 데이터를 추가합니다.
34+
*
35+
* @param data 저장할 데이터
36+
*/
37+
void addLast(E data);
38+
39+
/**
40+
* 덱의 앞부분에 위치한 데이터를 제거합니다.
41+
*
42+
* @return 덱의 앞부분에 위치했던 데이터
43+
*/
44+
E removeFirst();
45+
46+
/**
47+
* 덱의 뒷부분에 위치한 데이터를 제거합니다.
48+
*
49+
* @return 덱의 뒷부분에 위치했던 데이터
50+
*/
51+
E removeLast();
52+
53+
/**
54+
* 덱의 앞부분에 위치한 데이터를 반환합니다.
55+
*
56+
* @return 덱의 앞부분에 위치한 데이터
57+
*/
58+
E getFirst();
59+
60+
/**
61+
* 덱의 뒷부분에 위치한 데이터를 반환합니다.
62+
*
63+
* @return 덱의 뒷부분에 위치한 데이터
64+
*/
65+
E getLast();
66+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package queue;
2+
3+
import exception.EmptyQueueException;
4+
5+
public class LinkedListQueue<E> implements Queue<E> {
6+
7+
private int size;
8+
private Node<E> front;
9+
private Node<E> rear;
10+
11+
@Override
12+
public int size() {
13+
return this.size;
14+
}
15+
16+
@Override
17+
public boolean isEmpty() {
18+
return this.size == 0;
19+
}
20+
21+
@Override
22+
public void enqueue(E data) {
23+
Node<E> newNode = new Node<>(data);
24+
if (isEmpty()) {
25+
this.front = newNode;
26+
} else {
27+
this.rear.next = newNode;
28+
}
29+
this.rear = newNode;
30+
this.size++;
31+
}
32+
33+
@Override
34+
public E dequeue() {
35+
if (isEmpty()) {
36+
throw new EmptyQueueException();
37+
}
38+
E retData = this.front.data;
39+
this.front = this.front.next;
40+
this.size--;
41+
42+
return retData;
43+
}
44+
45+
@Override
46+
public E peek() {
47+
if (isEmpty()) {
48+
throw new EmptyQueueException();
49+
}
50+
51+
return this.front.data;
52+
}
53+
54+
private static class Node<T> {
55+
56+
private T data;
57+
private Node<T> next;
58+
59+
public Node(T data) {
60+
this.data = data;
61+
}
62+
}
63+
}

yoonexample/src/test/java/queue/QueueTest.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,74 @@ class QueueTest {
7878
assertThat(queue.isEmpty()).isTrue();
7979
assertThat(queue.size()).isEqualTo(0);
8080
}
81+
82+
@Test
83+
@DisplayName("연결_리스트_기반_큐_생성_테스트")
84+
void 연결_리스트_기반_큐_생성_테스트() {
85+
Queue<Integer> queue = new LinkedListQueue<>();
86+
87+
assertThat(queue).isNotNull();
88+
assertThat(queue.isEmpty()).isTrue();
89+
assertThat(queue.size()).isEqualTo(0);
90+
}
91+
92+
@Test
93+
@DisplayName("연결_리스트_기반_큐_생성_테스트")
94+
void 연결_리스트_기반_큐_EmptyQueueException_테스트() {
95+
Queue<Integer> queue = new LinkedListQueue<>();
96+
97+
assertThat(queue).isNotNull();
98+
assertThat(queue.isEmpty()).isTrue();
99+
assertThat(queue.size()).isEqualTo(0);
100+
assertThatThrownBy(queue::dequeue).isInstanceOf(EmptyQueueException.class);
101+
assertThatThrownBy(queue::peek).isInstanceOf(EmptyQueueException.class);
102+
}
103+
104+
@Test
105+
@DisplayName("연결_리스트_기반_큐_데이터_저장_테스트")
106+
void 연결_리스트_기반_큐_데이터_저장_테스트() {
107+
Queue<Integer> queue = new LinkedListQueue<>();
108+
109+
queue.enqueue(1);
110+
queue.enqueue(2);
111+
queue.enqueue(3);
112+
queue.enqueue(4);
113+
queue.enqueue(5);
114+
115+
assertThat(queue).isNotNull();
116+
assertThat(queue.isEmpty()).isFalse();
117+
assertThat(queue.size()).isEqualTo(5);
118+
}
119+
120+
@Test
121+
@DisplayName("연결_리스트_기반_큐_데이터_저장_후_제거_테스트")
122+
void 연결_리스트_기반_큐_데이터_저장_후_제거_테스트() {
123+
Queue<Integer> queue = new LinkedListQueue<>();
124+
125+
queue.enqueue(1);
126+
queue.enqueue(2);
127+
queue.enqueue(3);
128+
queue.enqueue(4);
129+
queue.enqueue(5);
130+
131+
assertThat(queue).isNotNull();
132+
assertThat(queue.isEmpty()).isFalse();
133+
assertThat(queue.size()).isEqualTo(5);
134+
assertThat(queue.peek()).isEqualTo(1);
135+
assertThat(queue.dequeue()).isEqualTo(1);
136+
assertThat(queue.size()).isEqualTo(4);
137+
assertThat(queue.peek()).isEqualTo(2);
138+
assertThat(queue.dequeue()).isEqualTo(2);
139+
assertThat(queue.size()).isEqualTo(3);
140+
assertThat(queue.peek()).isEqualTo(3);
141+
assertThat(queue.dequeue()).isEqualTo(3);
142+
assertThat(queue.size()).isEqualTo(2);
143+
assertThat(queue.peek()).isEqualTo(4);
144+
assertThat(queue.dequeue()).isEqualTo(4);
145+
assertThat(queue.size()).isEqualTo(1);
146+
assertThat(queue.peek()).isEqualTo(5);
147+
assertThat(queue.dequeue()).isEqualTo(5);
148+
assertThat(queue.isEmpty()).isTrue();
149+
assertThat(queue.size()).isEqualTo(0);
150+
}
81151
}

0 commit comments

Comments
 (0)