Skip to content

Commit 7df2174

Browse files
authored
Merge pull request #28 from Data-Structure-Study/yoonexample
덱 구현코드 추가
2 parents 0444d5f + 78e278a commit 7df2174

File tree

3 files changed

+245
-0
lines changed

3 files changed

+245
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package deque;
2+
3+
import exception.EmptyDequeException;
4+
5+
public class LinkedListDeque<E> implements Deque<E> {
6+
7+
private int size;
8+
private Node<E> head;
9+
private Node<E> tail;
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 addFirst(E data) {
23+
Node<E> newNode = new Node<>(data);
24+
if (isEmpty()) {
25+
this.tail = newNode;
26+
} else {
27+
this.head.prev = newNode;
28+
}
29+
30+
newNode.next = this.head;
31+
this.head = newNode;
32+
this.size++;
33+
}
34+
35+
@Override
36+
public void addLast(E data) {
37+
Node<E> newNode = new Node<>(data);
38+
if (isEmpty()) {
39+
this.head = newNode;
40+
} else {
41+
this.tail.next = newNode;
42+
}
43+
44+
newNode.prev = this.tail;
45+
this.tail = newNode;
46+
this.size++;
47+
}
48+
49+
@Override
50+
public E removeFirst() {
51+
if (isEmpty()) {
52+
throw new EmptyDequeException();
53+
}
54+
55+
E data = this.head.data;
56+
this.head = this.head.next;
57+
this.size--;
58+
return data;
59+
}
60+
61+
@Override
62+
public E removeLast() {
63+
if (isEmpty()) {
64+
throw new EmptyDequeException();
65+
}
66+
67+
E data = this.tail.data;
68+
this.tail = this.tail.prev;
69+
this.size--;
70+
return data;
71+
}
72+
73+
@Override
74+
public E getFirst() {
75+
if (isEmpty()) {
76+
throw new EmptyDequeException();
77+
}
78+
79+
return this.head.data;
80+
}
81+
82+
@Override
83+
public E getLast() {
84+
if (isEmpty()) {
85+
throw new EmptyDequeException();
86+
}
87+
88+
return this.tail.data;
89+
}
90+
91+
private static class Node<T> {
92+
93+
private T data;
94+
private Node<T> next;
95+
private Node<T> prev;
96+
97+
public Node(T data) {
98+
this.data = data;
99+
}
100+
}
101+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package exception;
2+
3+
public class EmptyDequeException extends RuntimeException {
4+
5+
public EmptyDequeException() {
6+
super("Deque is Emtpy.");
7+
}
8+
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
package deque;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
5+
6+
import exception.EmptyDequeException;
7+
import org.junit.jupiter.api.DisplayName;
8+
import org.junit.jupiter.api.Test;
9+
10+
class DequeTest {
11+
12+
@Test
13+
@DisplayName("덱의_생성_및_초기화_테스트")
14+
void 덱의_생성_및_초기화_테스트() {
15+
Deque<Integer> deque = new LinkedListDeque<>();
16+
17+
assertThat(deque).isNotNull();
18+
assertThat(deque.size()).isEqualTo(0);
19+
assertThat(deque.isEmpty()).isTrue();
20+
}
21+
22+
@Test
23+
@DisplayName("덱에_데이터_삽입_테스트")
24+
void 덱에_데이터_삽입_테스트() {
25+
Deque<Integer> deque = new LinkedListDeque<>();
26+
27+
deque.addFirst(3);
28+
deque.addFirst(2);
29+
deque.addFirst(1);
30+
deque.addLast(4);
31+
deque.addLast(5);
32+
deque.addLast(6);
33+
34+
assertThat(deque).isNotNull();
35+
assertThat(deque.size()).isEqualTo(6);
36+
assertThat(deque.isEmpty()).isFalse();
37+
}
38+
39+
@Test
40+
@DisplayName("덱에_데이터_삽입_앞에서_삭제_테스트")
41+
void 덱에_데이터_삽입_앞에서_삭제_테스트() {
42+
Deque<Integer> deque = new LinkedListDeque<>();
43+
44+
deque.addFirst(3);
45+
deque.addFirst(2);
46+
deque.addFirst(1);
47+
deque.addLast(4);
48+
deque.addLast(5);
49+
deque.addLast(6);
50+
51+
assertThat(deque).isNotNull();
52+
assertThat(deque.size()).isEqualTo(6);
53+
assertThat(deque.isEmpty()).isFalse();
54+
assertThat(deque.getFirst()).isEqualTo(1);
55+
assertThat(deque.getLast()).isEqualTo(6);
56+
assertThat(deque.removeFirst()).isEqualTo(1);
57+
assertThat(deque.size()).isEqualTo(5);
58+
assertThat(deque.getFirst()).isEqualTo(2);
59+
assertThat(deque.getLast()).isEqualTo(6);
60+
assertThat(deque.removeFirst()).isEqualTo(2);
61+
assertThat(deque.size()).isEqualTo(4);
62+
assertThat(deque.getFirst()).isEqualTo(3);
63+
assertThat(deque.getLast()).isEqualTo(6);
64+
assertThat(deque.removeFirst()).isEqualTo(3);
65+
assertThat(deque.size()).isEqualTo(3);
66+
assertThat(deque.getFirst()).isEqualTo(4);
67+
assertThat(deque.getLast()).isEqualTo(6);
68+
assertThat(deque.removeFirst()).isEqualTo(4);
69+
assertThat(deque.size()).isEqualTo(2);
70+
assertThat(deque.getFirst()).isEqualTo(5);
71+
assertThat(deque.getLast()).isEqualTo(6);
72+
assertThat(deque.removeFirst()).isEqualTo(5);
73+
assertThat(deque.size()).isEqualTo(1);
74+
assertThat(deque.getFirst()).isEqualTo(6);
75+
assertThat(deque.getLast()).isEqualTo(6);
76+
assertThat(deque.removeFirst()).isEqualTo(6);
77+
assertThat(deque.size()).isEqualTo(0);
78+
assertThat(deque.isEmpty()).isTrue();
79+
}
80+
81+
@Test
82+
@DisplayName("덱에_데이터_삽입_뒤에서_삭제_테스트")
83+
void 덱에_데이터_삽입_뒤에서_삭제_테스트() {
84+
Deque<Integer> deque = new LinkedListDeque<>();
85+
86+
deque.addFirst(3);
87+
deque.addFirst(2);
88+
deque.addFirst(1);
89+
deque.addLast(4);
90+
deque.addLast(5);
91+
deque.addLast(6);
92+
93+
assertThat(deque).isNotNull();
94+
assertThat(deque.size()).isEqualTo(6);
95+
assertThat(deque.isEmpty()).isFalse();
96+
assertThat(deque.getFirst()).isEqualTo(1);
97+
assertThat(deque.getLast()).isEqualTo(6);
98+
assertThat(deque.removeLast()).isEqualTo(6);
99+
assertThat(deque.size()).isEqualTo(5);
100+
assertThat(deque.getFirst()).isEqualTo(1);
101+
assertThat(deque.getLast()).isEqualTo(5);
102+
assertThat(deque.removeLast()).isEqualTo(5);
103+
assertThat(deque.size()).isEqualTo(4);
104+
assertThat(deque.getFirst()).isEqualTo(1);
105+
assertThat(deque.getLast()).isEqualTo(4);
106+
assertThat(deque.removeLast()).isEqualTo(4);
107+
assertThat(deque.size()).isEqualTo(3);
108+
assertThat(deque.getFirst()).isEqualTo(1);
109+
assertThat(deque.getLast()).isEqualTo(3);
110+
assertThat(deque.removeLast()).isEqualTo(3);
111+
assertThat(deque.size()).isEqualTo(2);
112+
assertThat(deque.getFirst()).isEqualTo(1);
113+
assertThat(deque.getLast()).isEqualTo(2);
114+
assertThat(deque.removeLast()).isEqualTo(2);
115+
assertThat(deque.size()).isEqualTo(1);
116+
assertThat(deque.getFirst()).isEqualTo(1);
117+
assertThat(deque.getLast()).isEqualTo(1);
118+
assertThat(deque.removeLast()).isEqualTo(1);
119+
assertThat(deque.size()).isEqualTo(0);
120+
assertThat(deque.isEmpty()).isTrue();
121+
}
122+
123+
@Test
124+
@DisplayName("덱이_비어있을_때_예외_처리_테스트")
125+
void 덱이_비어있을_때_예외_처리_테스트() {
126+
Deque<Integer> deque = new LinkedListDeque<>();
127+
128+
assertThat(deque).isNotNull();
129+
assertThat(deque.size()).isEqualTo(0);
130+
assertThat(deque.isEmpty()).isTrue();
131+
assertThatThrownBy(deque::getFirst).isInstanceOf(EmptyDequeException.class);
132+
assertThatThrownBy(deque::removeFirst).isInstanceOf(EmptyDequeException.class);
133+
assertThatThrownBy(deque::getLast).isInstanceOf(EmptyDequeException.class);
134+
assertThatThrownBy(deque::removeLast).isInstanceOf(EmptyDequeException.class);
135+
}
136+
}

0 commit comments

Comments
 (0)