-
Notifications
You must be signed in to change notification settings - Fork 24
/
P26_2.kt
104 lines (89 loc) · 2.86 KB
/
P26_2.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package ch10
class P26_2(k: Int) {
// 이중 연결 리스트로 사용할 클래스 선언
data class DoublyLinkedList(var `val`: Int) {
// 왼쪽으로 연결할 이중 연결 리스트
var left: DoublyLinkedList? = null
// 오른쪽으로 연결할 이중 연결 리스트
var right: DoublyLinkedList? = null
}
// 현재 큐의 크기
var len = 0
// 전체 큐의 크기
var k = 0
// 이중 연결 리스트 head 노드
var head: DoublyLinkedList? = null
// 이중 연결 리스트 tail 노드
var tail: DoublyLinkedList? = null
// 초기화 블록
init {
// 이중 연결 리스트 2개 생성
head = DoublyLinkedList(0)
tail = DoublyLinkedList(0)
// 서로 연결
head!!.right = tail
tail!!.left = head
// 전체 큐의 크기 지정
this.k = k
// 현재 큐의 크기 지정
len = 0
}
fun insertFront(value: Int): Boolean {
// 꽉 차 있으면 진행하지 않음
if (isFull()) return false
val node = DoublyLinkedList(value)
// 신규 노드는 head 바로 오른쪽에 삽입
node.right = head!!.right
node.left = head
head!!.right!!.left = node
head!!.right = node
len++
return true
}
fun insertLast(value: Int): Boolean {
// 꽉 차 있으면 진행하지 않음
if (isFull()) return false
val node = DoublyLinkedList(value)
// 신규 노드는 tail 바로 왼쪽에 삽입
node.left = tail!!.left
node.right = tail
tail!!.left!!.right = node
tail!!.left = node
len++
return true
}
fun deleteFront(): Boolean {
// 텅 비어 있다면 진행하지 않음
if (isEmpty()) return false
// head 바로 오른쪽 노드를 연결에서 끊음
head!!.right!!.right!!.left = head
head!!.right = head!!.right!!.right
len--
return true
}
fun deleteLast(): Boolean {
// 텅 비어 있다면 진행하지 않음
if (isEmpty()) return false
// tail 바로 왼쪽 노드를 연결에서 끊음
tail!!.left!!.left!!.right = tail
tail!!.left = tail!!.left!!.left
len--
return true
}
fun getFront(): Int {
// 맨 앞(head 오른쪽)의 값을 가져온다.
return if (isEmpty()) -1 else head!!.right!!.`val`
}
fun getRear(): Int {
// 맨 뒤(tail 왼쪽)의 값을 가져온다.
return if (isEmpty()) -1 else tail!!.left!!.`val`
}
fun isEmpty(): Boolean {
// 현재 큐의 크기가 0이면 비어 있음
return len == 0
}
fun isFull(): Boolean {
// 현재 큐의 크기가 처음 선언한 큐의 크기와 일치하면 꽉 차 있음
return len == k
}
}